ClassNotFoundException尽管提供了正确的Gradle依赖



在使用Gradle 7.4.2和JDK 17的Spring Boot 3.0.4项目中,当使用gradlew bootRun运行应用程序时,我面临一个(大量)记录错误:

java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlElement

然后我添加这个依赖项:

runtimeOnly group: 'com.sun.xml.bind', name: 'jaxb-impl', version:'4.0.0'

当运行gradlew dependencies时,我得到runtimeClasspath:

runtimeClasspath - Runtime classpath of source set 'main'.
+--- com.google.code.findbugs:jsr305:3.0.2
+--- org.springframework.boot:spring-boot-starter-web -> 3.0.4
|    +--- org.springframework.boot:spring-boot-starter:3.0.4
|    |    +--- org.springframework.boot:spring-boot:3.0.4
...
+--- net.logstash.logback:logstash-logback-encoder:7.3
|    --- com.fasterxml.jackson.core:jackson-databind:2.14.2 (*)
+--- org.codehaus.janino:janino -> 3.1.9
|    --- org.codehaus.janino:commons-compiler:3.1.9
+--- com.fasterxml.jackson.module:jackson-module-jaxb-annotations -> 2.14.2
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.14.2 (*)
|    +--- com.fasterxml.jackson.core:jackson-core:2.14.2 (*)
|    +--- com.fasterxml.jackson.core:jackson-databind:2.14.2 (*)
|    +--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.3 -> 4.0.0 (*)
|    +--- jakarta.activation:jakarta.activation-api:1.2.2 -> 2.1.1
|    --- com.fasterxml.jackson:jackson-bom:2.14.2 (*)
--- com.sun.xml.bind:jaxb-impl:4.0.0
--- com.sun.xml.bind:jaxb-core:4.0.0 -> 4.0.2
+--- jakarta.xml.bind:jakarta.xml.bind-api:4.0.0 (*)
--- org.eclipse.angus:angus-activation:2.0.0 (*)

所以jakarta.xml.bind:jakarta.xml.bind-api:4.0.0存在,因此应该找到javax.xml.bind.annotation.XmlElement(我看到它属于jakarta.xml。我的IDE中的bind-api jar)..但它不是。

我错过了什么?

好吧,这很奇怪…

最初,我的依赖项是:

runtimeOnly group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '7.3'
runtimeOnly group: 'org.codehaus.janino', name: 'janino'

但是我得到这个错误:

Error occurred while dynamically loading jackson modules java.util.ServiceConfigurationError: com.fasterxml.jackson.databind.Module: Provider com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule not found

所以我添加了这个依赖项,以便找到丢失的类:

runtimeOnly group: 'com.fasterxml.jackson.module', name: 'jackson-module-jaxb-annotations'

然后我得到:

Caused by: java.lang.ClassNotFoundException:javax.xml.bind.annotation.XmlElement

和添加runtimeOnly group: 'com.sun.xml.bind', name: 'jaxb-impl', version:'4.0.0'没有帮助,如问题所述。

现在,我刚刚删除了jackson-module-jaxb-annotations,留下了jaxb-impl,它工作了.. 我对"为什么"有点困惑。虽然. .

下面是dependencies任务的输出:

runtimeClasspath - Runtime classpath of source set 'main'.
+--- com.google.code.findbugs:jsr305:3.0.2
+--- org.springframework.boot:spring-boot-starter-web -> 3.0.4
|    +--- org.springframework.boot:spring-boot-starter:3.0.4
|    |    +--- org.springframework.boot:spring-boot:3.0.4
...
+--- net.logstash.logback:logstash-logback-encoder:7.3
|    --- com.fasterxml.jackson.core:jackson-databind:2.14.2 (*)
+--- org.codehaus.janino:janino -> 3.1.9
|    --- org.codehaus.janino:commons-compiler:3.1.9
--- jakarta.xml.bind:jakarta.xml.bind-api:4.0.0 (*)

最新更新