Как решить проблемы с путями к классам JAXB в Java 12

Импортирую приложение с использованием JAXB в JDK 11/12, но я полностью теряюсь, пытаясь исправить эти проблемы с путями к классам JAXB. Я погуглил и прочитал в основном все, что связано с этим, поэтому я знаю об изменениях, внесенных в Java11, то есть об удалении JAXB из JDK ... Однако в этом случае я бы предположил тривиальное исправление, состоящее из добавления api и impl JAR в путь к классам. Но это не работает, и, несмотря на то, что у меня есть эти JAR-файлы в пути к классам, я все еще получаю известное исключение, несмотря на использование 2.3.2 JAXB:

javax.xml.bind.JAXBException - со связанным исключением: [java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]

даже если я вижу, что класс находится в другом пакете, и я приказываю использовать правильный пакет через системную переменную, он тоже не работает:

gradle -Djavax.xml.bind.context.factory = com.sun.xml.bind.v2.ContextFactory build

javax.xml.bind.JAXBException - со связанным исключением: [java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory]

Кто-нибудь знает, как это решить? Я не хочу играть с файлами манифеста и т. Д. Должна быть возможность просто разместить правильные JAR-файлы в пути к классам, и все, или нет?

Резюме здесь, но не удается заставить его работать: http://www.descher.at/descher-vu/2019/01/java-11-jaxb-and-osgi/

Обновление, зависимости, используемые в Gradle: - jaxb-xjc имеет jaxb-runtime (impl.) Как транзитивную зависимость. Я вижу, что это выбрано Gradle, но все та же ошибка.

classpath "com.sun.activation:javax.activation:1.2.0"
classpath "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
classpath "org.glassfish.jaxb:jaxb-xjc:2.3.2"
classpath"org.glassfish.jaxb:jaxb-core:2.3.0.1"

[org.gradle.internal.operations.DefaultBuildOperationExecutor] Операция сборки «Разрешить jaxb-runtime.jar (org.glassfish.jaxb: jaxb-runtime: 2.3.2)» завершена

[org.gradle.internal.component.model.ComponentAttributeMatcher] Выбранное соответствие org.glassfish.jaxb: jaxb-runtime: среда выполнения конфигурации 2.3.2 из кандидатов [org.glassfish.jaxb: jaxb-runtime: среда выполнения конфигурации 2.3.2] для {org.gradle.dependency.bundling = external, org.gradle.jvm.version = 12, org.gradle.usage = java-runtime}

Это вывод "зависимостей gradle" и все jar-файлы JAXB присутствуют, но ошибка пути к классам все еще выдается. JAR-файл jaxb-runtime от Glassfish наверняка имеет этот класс ContextFactory.

runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.springframework.boot:spring-boot-starter-log4j2 -> 2.1.0.RELEASE
|    +--- org.apache.logging.log4j:log4j-slf4j-impl:2.11.1
|    |    +--- org.slf4j:slf4j-api:1.7.25
|    |    +--- org.apache.logging.log4j:log4j-api:2.11.1
|    |    \--- org.apache.logging.log4j:log4j-core:2.11.1
|    |         \--- org.apache.logging.log4j:log4j-api:2.11.1
|    +--- org.apache.logging.log4j:log4j-core:2.11.1 (*)
|    +--- org.apache.logging.log4j:log4j-jul:2.11.1
|    |    \--- org.apache.logging.log4j:log4j-api:2.11.1
|    \--- org.slf4j:jul-to-slf4j:1.7.25
|         \--- org.slf4j:slf4j-api:1.7.25
+--- org.projectlombok:lombok -> 1.18.2
+--- org.apache.commons:commons-lang3 -> 3.8.1
+--- org.apache.commons:commons-collections4 -> 4.4
+--- com.google.guava:guava -> 23.0
|    +--- com.google.code.findbugs:jsr305:1.3.9
|    +--- com.google.errorprone:error_prone_annotations:2.0.18
|    +--- com.google.j2objc:j2objc-annotations:1.1
|    \--- org.codehaus.mojo:animal-sniffer-annotations:1.14
+--- org.apache.ws.xmlschema:xmlschema-core -> 2.0.1
+--- org.glassfish.jaxb:jaxb-runtime:2.3.2
|    +--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.2
|    |    \--- jakarta.activation:jakarta.activation-api:1.2.1
|    +--- org.glassfish.jaxb:txw2:2.3.2
|    +--- com.sun.istack:istack-commons-runtime:3.0.8
|    |    \--- jakarta.activation:jakarta.activation-api:1.2.1
|    +--- org.jvnet.staxex:stax-ex:1.8.1
|    |    +--- jakarta.activation:jakarta.activation-api:1.2.1
|    |    \--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 (*)
|    +--- com.sun.xml.fastinfoset:FastInfoset:1.2.16
|    \--- jakarta.activation:jakarta.activation-api:1.2.1
\--- org.glassfish.jaxb:jaxb-core:2.3.0.1
     +--- javax.xml.bind:jaxb-api:2.3.0 -> 2.3.1
     |    \--- javax.activation:javax.activation-api:1.2.0
     +--- org.glassfish.jaxb:txw2:2.3.0.1 -> 2.3.2
     \--- com.sun.istack:istack-commons-runtime:3.0.5 -> 3.0.8 (*)

person JavaDude    schedule 15.09.2019    source источник
comment
Вместо включения устаревшего модуля javax.xml.bind вы должны просто добавить необходимые библиотеки в зависимости от вашего проекта: stackoverflow.com/a/ 57643763/150978   -  person Robert    schedule 16.09.2019
comment
Я считаю, что у меня есть эти зависимости, но я не могу избавиться от ошибки.   -  person JavaDude    schedule 16.09.2019
comment
Сообщение обновлено с подробной информацией о зависимостях.   -  person JavaDude    schedule 17.09.2019
comment
Отвечает ли это на ваш вопрос? Замена устаревших модулей JPMS API Java EE   -  person 9ilsdx 9rvj 0lo    schedule 07.06.2021


Ответы (1)


По какой-то причине мне не повезло с JAR-файлами Glassfish, но эти оригинальные зависимости Sun / Oracle работали.

person JavaDude    schedule 26.09.2019
comment
Я использую <dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.0</version></dependency> <dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-core</artifactId><version>2.3.0</version></dependency> - person Julien Kronegg; 04.09.2020