java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory

java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory

我是 Java 和 Gradle 的新手,我正在尝试构建一个简单的 REST API,这是我的依赖项

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.7.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'

    implementation("org.springframework.boot:spring-boot-starter-actuator:2.6.7")
    implementation 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
    implementation 'com.sun.xml.bind:jaxb-core:4.0.0-M4'
    implementation 'com.sun.xml.bind:jaxb-impl:4.0.0-M4'
}

我收到以下错误: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory

我见过类似的问题,但找不到解决方案

您的 JAXB API 和实现版本不匹配。 jaxb-core 4.0.0-M4 depends on jakarta.xml.bind:jakarta.xml.bind-api 4.0.0。这与您的 JAXB API 版本完全不兼容。最大的区别是您的 JAXB API 版本使用 javax 包前缀,而 Jakarta API 版本使用 jakarta 包前缀。我猜 Spring 想要使用与您正在使用的 API 版本兼容的实现(Spring 尚未切换到 Jakarta EE 9)。

我正在查看是否有 Spring 用于 JAXB 的引导启动器或类似的东西,但我找不到任何东西。这意味着您可能需要提供自己的实现。我建议您改用 Jakarta EE 8 版本:https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api/2.3.3 for the API, and https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime/2.3.6 来实现。两者都是仍然使用 javax 包前缀的最新版本。