В проекте Spring Boot 3.0.4 с использованием Gradle 7.4.2 и JDK 17 я сталкиваюсь с (обширно) задокументированной ошибкой при запуске моего приложения с помощью 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.bind-api в моей среде IDE).. но это не так.
что мне не хватает?
Ладно, это странно...
Первоначально мои зависимости были:
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 (*)