У меня есть некоторый код, который использует классы 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.К счастью, эти API Java EE, которые были предоставлены в JDK 6/7/8, все еще находятся в JDK, но они просто не находятся в пути к классам по умолчанию. Дополнительные API Java EE предоставляются в следующих модулях:
Быстрое и грязное решение: (только JDK 9/10)
Чтобы сделать JAXB API доступными во время выполнения, укажите следующую опцию командной строки:
--add-modules java.xml.bind
Но мне все еще нужно это для работы с Java 8 !!!
Если вы попытаетесь указать
--add-modules
более старый JDK, он взорвется, потому что это нераспознанная опция. Я предлагаю один из двух вариантов:JDK_JAVA_OPTIONS
переменную окружения. Эта переменная среды автоматически читается программой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
так же , как указанные выше модули API Java EE. Обратите внимание, это не работает в Java 11, потому чтоjava.se.ee
было удалено в Java 11.Правильное долгосрочное решение: (JDK 9 и выше)
Все вышеперечисленные модули API Java EE помечены,
@Deprecated(forRemoval=true)
потому что они запланированы для удаления в Java 11 . Таким образом, этот--add-module
подход больше не будет работать в Java 11 "из коробки".В Java 11 и более поздних версиях вам нужно будет включить свою собственную копию API Java EE в путь к классам или в пути к модулям. Например, вы можете добавить API JAX-B в качестве зависимости Maven, например так:
Посмотрите страницу Реализации Референции JAXB для получения более подробной информации о JAXB.
Для получения полной информации о модульности Java см. JEP 261: Модульная система
Для разработчиков Gradle или Android Studio: (JDK 9 и выше)
Добавьте следующие зависимости в ваш
build.gradle
файл:источник
javax.xml.bind
и другие классы JavaEE планируется удалить в Java 11 в соответствии с JEP-320 .java.se.ee
модуль был удален, так что--add-modules
решение больше не работает. Вместо этого используйте рекомендуемое решение: добавьте JAXB в качестве отдельной зависимости.В моем случае (весенний загрузочный толстый кувшин) я просто добавляю следующее в pom.xml.
источник
testCompile('javax.xml.bind:jaxb-api')
работает для меня.<scope>runtime</scope>
для такого случаяНи одно из этих решений не работало для меня хорошо в недавнем JDK 9.0.1.
Я обнаружил, что этого списка зависимостей достаточно для правильного функционирования, поэтому вам не нужно явно указывать
--add-module
(хотя он указан в pom этих зависимостей). Единственное, что вам нужно, это указать этот список зависимостей:источник
pom.xml
файл конфигурации Maven. Если вы не знаете , что это такое, то лучше начать с beggining<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>
как последнюю зависимость.Это сработало для меня:
Обновить
Как предложил @Jasper, чтобы избежать зависимости от всей библиотеки EclipseLink, вы также можете просто зависеть от EclipseLink MOXy:
специалист
Gradle
Как зависимости для моего приложения Java 8, которое создает * .jar, который может быть запущен как JRE 8, так и JRE 9 без дополнительных аргументов.
Кроме того, это нужно выполнить где-то перед использованием JAXB API:
Прекрасно работает до сих пор, как обходной путь. Не похоже на идеальное решение, хотя ...
источник
org.eclipse.persistence:eclipselink
только для получения JAXB API - очень тяжелая зависимость, разве вы уже используете eclipselink?-XX:+IgnoreUnrecognizedVMOptions
командной строки (обновил мой ответ с подробностями)org.eclipse.persistence
, artifactIdorg.eclipse.persistence.moxy
.чистое решение для всех JDK> = 9
Вам нужно добавить две зависимости в вашу сборку
В качестве реализации я выбрал использование ссылочной реализации Glassfish, чтобы избавиться от старых классов / библиотек com.sun. В результате я добавил в свою сборку Maven
Обратите внимание, что начиная с версии 2.3.1 вам больше не нужно добавлять javax.activation. (см. https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )
источник
это потому, что Java-версия, если вы используете JDK 9 или более позднюю версию, просто добавьте это в свой POM
источник
Чтобы решить эту проблему, я импортировал несколько файлов JAR в свой проект:
http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.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
источник
com.sun.xml.bind
артефакты старые и предоставляются только для обратной совместимости.org.glassfish.jaxb
Вместо этого вы должны использовать эквивалентные артефакты, как указано в некоторых других ответах.Во время компиляции, а также во время выполнения, добавьте переключатель
--add-modules java.xml.bind
Хорошее введение
JDK 9
модулей также можно найти по адресу: https://www.youtube.com/watch?v=KZfbRuvv5qcисточник
Это сработало для меня. Добавление только jaxb-api было недостаточно.
источник
com.sun.xml.bind
артефакты старые и предоставляются только для обратной совместимости.org.glassfish.jaxb
Вместо этого вы должны использовать эквивалентные артефакты, как указано в некоторых других ответах.Перейдите в Your Build.gradle и добавьте ниже зависимости для Java 9 или Java 10.
источник
Ты можешь использовать
--add-modules=java.xml.bind
опцию JVM для добавления модуля связывания xml в среду выполнения JVM.Например:
java --add-modules=java.xml.bind XmlTestClass
источник
Обновление апреля 2019
Changelong для релизов JAXB находится по адресу https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html.
выдержки:
Официальная ссылка на https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 загружает:
Оригинальный ответ
После Какие артефакты я должен использовать для JAXB RI в моем проекте Maven? в Maven вы можете использовать профиль как:
Дерево зависимостей показывает:
Чтобы использовать это в Eclipse, скажем, Oxygen.3a Release (4.7.3a) или новее, Ctrl-Alt-P или щелкните правой кнопкой мыши проект Maven, затем выберите профиль.
источник
javax.xml.bind
> того,jaxb-api
что я видел в другом месте, на самом деле является избыточной. Зависимость стеклянной рыбы тянет это. Я только что попробовал, и это действительно работает.Для Java Web Start Execution мы можем использовать предложение Энди Гиберта, как это:
Обратите внимание на дополнительные "=" в --add-modules. См. Этот билет OpenJDK или последнюю заметку в разделе «Общие сведения о предупреждениях доступа во время выполнения» платформы Java, Standard Edition Oracle JDK 9, Руководство по миграции .
источник
добавить зависимость javax.xml.bind в pom.xml
источник
Поскольку JavaEE теперь регулируется https://jakarta.ee/ , новые координаты Maven с 2.3.2:
https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts
Первый выпущенный jaxb.version - 2.3.2.
источник
Я следовал по этому URL, и приведенные ниже настройки действительно помогли мне. Я использую Java 10 с STS IDE в Macbook Pro. Работает как часы.
источник
Это решило мои проблемы с зависимостями, работающими под управлением Apache Camel 2.24.1 на Java 12:
источник
Я столкнулся с той же проблемой, используя Spring Boot
2.0.5.RELEASE
на Java 11.Добавление
javax.xml.bind:jaxb-api:2.3.0
одного не решило проблему. Мне также пришлось обновить Spring Boot до последней версии Milestone2.1.0.M2
, поэтому я предполагаю, что это будет исправлено в следующем официальном выпуске.источник
Вам необходимо добавить зависимости JAX-B при использовании JDK 9+. Для пользователей Android студии, вам нужно добавить к вашему
build.gradle
«секdependencies {}
блока:источник
Я также запутался в ClassNotFoundException: javax.xml.bind.DatatypeConverter, используя Java 11 и
Я перепробовал все это, добавив javax.xml.bind: jaxb-api или весеннюю загрузку jakarta.xml.bind-api .. Я нашел подсказку для исправлений в jjwt версии 0.10.0 ... но самое главное, пакет jjwt сейчас раскололся!
Таким образом, проверьте эту ссылку: https://github.com/jwtk/jjwt/issues/510
Просто, если вы используете
пойти на
jjwt версия 0.11.x, но используйте разделенные пакеты: https://github.com/jwtk/jjwt#install
Вы не найдете более высокую версию для зависимости jjwt, так как они разделяют пакеты.
Приветствия.
источник
Не ответ, а дополнение: я получил, потому что запуск
groovysh
(Groovy 2.4.13), если JAVA_HOME указывает на установку Java 9 (java version "9.0.1"
если быть точным), терпит неудачу ужасно:Решением было:
Перейдите к проекту JAXB по адресу github.io ( «JAXB лицензируется по двойной лицензии - CDDL 1.1 и GPL 2.0 с исключением Class-path» )
Скачать
jaxb-ri-2.3.0.zip
Разархивируйте, куда бы вы ни поместили файлы инфраструктуры Java (в моем случае,
/usr/local/java/jaxb-ri/
). Другое решение может существовать (возможно, через SDKMAN, я не знаю)Убедитесь, что файлы jar в подкаталоге lib находятся в
CLASSPATH
. Я делаю это через скрипт, запускаемый при запуске bash, называемый/etc/profile.d/java.sh
, где я добавил (среди многих других строк) следующий цикл:Упакован в функцию ...
И это работает!
источник
Вам нужна только 1 зависимость:
источник
ОК, у меня возникла такая же проблема, но я использовал Java 8 и продолжал получать эту ошибку, я попробовал большинство решений. но оказывается, что мой maven все еще указывал на java 9, хотя я установил глобальную версию Java на 8, как только исправил, что все заработало.
Для тех, кто может иметь такие проблемы, ознакомьтесь с Как исправить Maven для использования Java по умолчанию
источник
Старый ответ «Проблема решена переключением на amazoncorretto». Ответ в новостях: Я использовал самую последнюю версию corretto, но похож на jdk 1.8. так что в любом случае нам нужно добавить зависимости вручную
источник
amazoncorretto:latest
настоящее время даёт JDK 8, а не 11. Многие образы Docker по-прежнему основаны на JDK 8, именно из-за проблем совместимости, вызванных удалением API между JDK 8 -> 11Версии зависимостей, которые мне нужно было использовать при компиляции для цели Java 8. Протестированное приложение в Java 8, 11 и 12 JRE.
источник
Для меня в Java 11 и Gradle это то, что получилось:
источник
Вам нужно добавить jaxb зависимости в Maven. Версия 2.3.2 для реализации Glassfish полностью совместима с новой версией Jakarta EE jaxb api 2.3.2.
источник
У меня были подобные проблемы после обновления моего проекта до Java 11, а затем исправлено обновление до весенней загрузки 2.1.1, которая, очевидно, имеет поддержку Java 11, это помогло
источник
Я знаю, что опаздываю на вечеринку, но моя ошибка закончилась тем, что мне нужно другое решение ... тоже очень просто
Первоначально я деполировал на Tomcat 9 и понял, что мне нужно 7 ... Я забыл отобразить свой путь к классу обратно в 7 версию в build.xml
Надеюсь, это исправит ошибку кого-то еще в будущем, кому удастся пропустить эту простую проблему, как я!
источник
Если вы вызываете веб-службы SOAP (например, используете
jaxws-maven-plugin
), просто добавив эту зависимость, все ошибки JAXB исчезнут:Протестировано с Java 13
источник