У меня есть код, использующий классы JAXB API, которые были предоставлены как часть JDK в Java 6/7/8. Когда я запускаю тот же код в Java 9, во время выполнения я получаю ошибки, указывающие на то, что классы JAXB не могут быть найдены.
Классы JAXB предоставлялись как часть JDK начиная с Java 6, так почему же Java 9 больше не может найти эти классы?
API JAXB считаются API Java EE и поэтому больше не содержатся в пути классов по умолчанию в Java SE 9. В Java 11 они полностью удалены из JDK.
Java 9 вводит понятия модулей, и по умолчанию на пути классов (или, скорее, на пути модулей) доступен агрегатный модуль java.se
. Как следует из названия, агрегатный модуль java.se
не включает API Java EE, которые традиционно поставлялись с Java 6/7/8.
К счастью, эти Java EE API, которые были предоставлены в JDK 6/7/8, все еще находятся в JDK, но они просто не включены в путь класса по умолчанию. Дополнительные API Java EE предоставляются в следующих модулях:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Быстрое и грязное решение: (только для JDK 9/10)
Чтобы сделать JAXB API доступными во время выполнения, укажите следующий параметр командной строки:
--add-modules java.xml.bind
Но мне все еще нужно, чтобы это работало с Java 8!!!
Если вы попробуете указать --add-modules
в более старой версии JDK, это приведет к ошибке, потому что это нераспознанная опция. Я предлагаю один из двух вариантов:
JDK_JAVA_OPTIONS
. Эта переменная окружения [автоматически считывается][1] программой запуска java
для Java 9+.-XX:+IgnoreUnrecognizedVMOptions
, чтобы заставить JVM молча игнорировать нераспознанные опции, вместо того, чтобы взрываться. Но будьте осторожны! Любые другие аргументы командной строки, которые вы используете, больше не будут проверяться JVM. Эта опция работает с Oracle/OpenJDK и IBM JDK (начиная с JDK 8sr4).Альтернативное быстрое решение: (только JDK 9/10)
Обратите внимание, что вы можете сделать все вышеперечисленные модули Java EE доступными во время выполнения, указав опцию --add-modules java.se.ee
. Модуль java.se.ee
является агрегированным модулем, который включает java.se.ee
, а также вышеперечисленные модули Java EE API. Обратите внимание, это не работает на Java 11, потому что java.se.ee
был удален в Java 11.
Правильное долгосрочное решение: (JDK 9 и выше)
Все перечисленные выше модули Java EE API помечены как @Deprecated(forRemoval=true)
, потому что они [запланированы к удалению][2] в [Java 11][3]. Поэтому подход --add-module
больше не будет работать в Java 11 из коробки.
Что вам нужно будет сделать в Java 11 и далее, так это включить свою собственную копию Java EE APIs в путь класса или модуля. Например, вы можете добавить API JAX-B в качестве зависимости в maven следующим образом:
<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
Более подробную информацию о JAXB смотрите на JAXB Reference Implementation page.
Полную информацию о модульности Java см. в [JEP 261: Module System][4].
Для разработчика Gradle или Android Studio: (JDK 9 и выше).
Добавьте следующие зависимости в файл build.gradle:
``groovy dependencies { // Зависимости JAX-B для JDK 9+ реализация "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" реализация "org.glassfish.jaxb:jaxb-runtime:2.3.2" }
[1]: https://www.oracle.com/technetwork/java/javase/9-new-features-3745613.html#JDK-8170832
[2]: http://openjdk.java.net/jeps/320
[3]: http://openjdk.java.net/projects/jdk/11/
[4]: http://openjdk.java.net/jeps/261
[5]: https://stackoverflow.com/a/46455026/3763032
В моем случае (весна загрузки жиров банку), я просто добавить следующую строку в pom.xml.
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
Ни одно из этих решений работал для меня в последние JDK версии 9.0.1.
Я обнаружил, что этот список зависимостей вполне достаточно для нормального функционирования, так вы Дон'т нужна явно указать - добавить-модуль
(хотя он указан в этих зависимостях'с пом'ы). Единственное, что вам нужно, это указать список зависимостей:
<dependencies>
<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-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
Это сработало для меня:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.7.0</version>
</dependency>
Как предложил @Jasper, чтобы не зависеть от всей библиотеки EclipseLink, вы также можете просто зависеть от EclipseLink MOXy:
Maven.
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.7.3</version>
</dependency>
Градл
compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'
В качестве зависимостей для моего приложения Java 8, которое создает *.jar, который может быть запущен как JRE 8, так и JRE 9 без дополнительных аргументов.
Кроме того, он должен быть выполнен где-то перед тем, как будет использован JAXB API:
System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");
Пока что работает отлично, как обходной путь. Однако не похоже, что это идеальное решение...
это´s, потому что Java-версии если вы используете JDK версии 9 или более поздней версии, просто добавьте в вашей пом
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
чистое решение для всех пакетов JDK >= 9
Нужно добавить две зависимости для сборки
В качестве реализации я решил использовать эталонную реализацию на GlassFish для избавиться от старых ком.солнце классов / библиотек. Так что в результате я добавил в мой сборка
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
Обратите внимание, что начиная с версии 2.3.1 вас Дон'т нужно добавить класс javax.активации больше. (см. https://github.com/eclipse-ee4j/jaxb-ri/issues/1222)
Во время компиляции, а также во время выполнения добавьте переключатель add-modules java.xml.bind
.
javac --add-modules java.xml.bind <java file name>
java --add-modules java.xml.bind <class file>
Хорошее введение в модули JDK 9
можно также найти на сайте :
Чтобы решить эту проблему, я импортировал некоторые файлы Jar в моем проекте:
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
Вы можете использовать `--добавление модулей=Ява.в формате XML.опцию JVM привязать, чтобы добавить модуль XML привязки к JVM во время выполнения окружающей среды.
Например: Ява-добавить-модулей=Ява.в формате XML.связать XmlTestClass
Обновление За Апрель 2019
Changelong для релизов JAXB является в https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html
выдержки:
4.1. Changes between 2.3.0.1 and 2.4.0
JAXB RI is now JPMS modularized:
All modules have native module descriptor.
Removed jaxb-core module, which caused split package issue on JPMS.
RI binary bundle now has single jar per dependency instead of shaded fat jars.
Removed runtime class weaving optimization.
4.2. Changes between 2.3.0 and 2.3.0.1
Removed legacy technology dependencies:
com.sun.xml.bind:jaxb1-impl
net.java.dev.msv:msv-core
net.java.dev.msv:xsdlib
com.sun.xml.bind.jaxb:isorelax
4.3. Changes between 2.2.11 and 2.3.0
Adopt Java SE 9:
JAXB api can now be loaded as a module.
JAXB RI is able to run on Java SE 9 from the classpath.
Addes support for java.util.ServiceLoader mechanism.
Security fixes
Авторитетная ссылка на https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
Мэйвен координаты для JAXB артефакты
В Джакарта.в формате XML.персонализация:Джакарта.в формате XML.привязать к API: АРІ-классы для JAXB. Требуется для сборки на JAXB.
орг.в GlassFish.на JAXB:в JAXB-среда: реализация JAXB, за выполнения для сериализации и десериализации объектов Java в/из XML.
на JAXB жир-банку связки:
У ком.солнце.в формате XML.персонализация:в JAXB-осущ: среда выполнения на JAXB жира В банке.
В отличие от В орг.в GlassFish.артефактов JAXB, эти банки имеют все зависимости классы вошли внутрь. Эти артефакты не содержит модуля совместной программы по методологии обследований описатели. В проектах Maven орг.в GlassFish.артефакты JAXB в должен использоваться вместо этого.
орг.в GlassFish.на JAXB:в JAXB-время:опарник:2.3.2 тянет на:
[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
[INFO] | +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO] | +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
[INFO] | +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
[INFO] | +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
[INFO] | +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
[INFO] | \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
Оригинальный Ответ
Следующим https://stackoverflow.com/questions/26413431/which-artifacts-should-i-use-for-jaxb-ri-in-my-maven-project в Maven, вы можете использовать профиль, как:
<profile>
<id>java-9</id>
<activation>
<jdk>9</jdk>
</activation>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</profile>
Зависимость показывает дерево:
[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
[INFO] | +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
[INFO] | | +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
[INFO] | | +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
[INFO] | | \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
[INFO] | +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
[INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
[INFO] \- javax.activation:activation:jar:1.1.1:compile
Чтобы использовать это в Eclipse, скажем кислорода.Выпуск 3а (4.7.3) или позже, контрол-Альт-П, или щелкните правой кнопкой мыши на проекте Maven, а затем выберите профиль.
Этот работал для меня. Добавление только в JAXB-АПИ было'т достаточно.
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb-api.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>${jaxb-api.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>${jaxb-api.version}</version>
</dependency>
Идут в сборку.Gradle и добавить ниже зависимостей для Java 9 или Java 10.
sourceCompatibility = 10 // You can also decrease your souce compatibility to 1.8
//java 9+ does not have Jax B Dependents
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
compile group: 'javax.activation', name: 'activation', version: '1.1.1'
добавить к javax.в формате XML.зависимость связывания в pom.xml
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
Для Java веб-запуск выполнения можно использовать Энди Гибер's, как это предложение:
<j2se version="1.6+"
java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>
Обратите внимание на дополнительные, что "=" В-добавить-модулей. Вижу его теперь билет]1 или последняя нота в "понимание выполнения предупреждения доступ к" из платформы Java, стандартной редакции СУБД Oracle версии JDK 9 руководство по миграции.
Я столкнулся с такой же проблемой с использованием Spring загрузки 2.0.5.Релиз на Java 11.
Добавление класса javax.в формате XML.персонализация:в JAXB-АФИ:2.3.0
в одиночку не решить проблему. Мне тоже пришлось обновить весенний ботинок на последний рубеж 2.1.0.М2
, поэтому я предполагаю, что это будет исправлено в следующем официальном релизе.
Я следовал этому URL и настройки внизу действительно помогло мне. Я использую Java 10 с СТС IDE в МасВоок Pro. Он работает как шарм.
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
Это решило мои проблемы с зависимостями запуск Apache верблюда 2.24.1 на Яве 12:
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0.1</version>
</dependency>
Не ответ, а дополнение: у меня ведь работает groovysh
(Заводной 2.4.13) при переменной JAVA_HOME указывает на Ява 9 установка (Java-версии и"9.0.1"
В, чтобы быть точным) не более:
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
...
..
.
..
...
at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more
Было принято решение:
Идите на проект в JAXB на GitHub.Ио ("в JAXB является лицензированной под двойной лицензией - 1.1 CDDL и GPL 2.0 с исключением и quot Путь к классу;)
Скачать jaxb-ri-2.3.0.zip`
Распаковать куда вы кладете файлы Java инфраструктуры (в моем случае, /usr/местные/Ява/в JAXB-Ри/
). Другие решения могут существовать (возможно через SDKMAN, я Незнайка)
Убедитесь, что банки в подкаталоге lib на классов
. Я делаю это через скрипт стартовал при запуске Баш, под названием /etc/profile.d/java.sh
, где я добавил (среди многих других линий) следующий цикл:
Упакованные в функцию...
function extend_qzminynshg {
local BASE="/usr/local/java"
for LIB in jaxb-api.jar jaxb-core.jar jaxb-impl.jar jaxb-jxc.jar jaxb-xjc.jar; do
local FQLIB="$BASE/jaxb-ri/lib/$LIB"
if [[ -f $FQLIB ]]; then
export CLASSPATH=$FQLIB:$CLASSPATH
fi
done
}
extend_qzminynshg; unset extend_qzminynshg
И это работает!
Поскольку в JavaEE теперь регулируется https://jakarta.ee/ новый Мэйвен координаты пункта 2.3.2 являются:
https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
Впервые выпущен в JAXB.версия 2.3.2.
<properties>
<jaxb.version>2.3.2</jaxb.version>
</properties>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>${jaxb.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb.version}</version>
</dependency>
ОК, у меня были те же проблемы, но я был с использованием Java 8, и продолжал получать эту ошибку, я попробовал большинство решений. но получается, что мой Мэйвен был по-прежнему указывая на Java 9 даже, хотя я поставил глобальную версию Java до 8, как только я установил, что все разрешилось.
Для тех, кто может иметь такого рода проблемы, проверьте как исправить Maven для использования Java по умолчанию