Пакет Java 11 javax.xml.bind не существует

Я пытаюсь десериализовать XML-данные в дерево содержимого Java, используя JAXB, проверяя данные XML, поскольку они неупорядочены:

try {
  JAXBContext context = JAXBContext.newInstance("com.acme.foo");
  Unmarshaller unmarshaller = context.createUnmarshaller();
  unmarshaller.setSchema(schema);
  FooObject fooObj = (FooObject) unmarshaller.unmarshal(new File("foo.xml"));
} catch (UnmarshalException ex) {
  ex.printStackTrace();
} catch (JAXBException ex) {
  ex.printStackTrace();
}

Когда я создаю проект с помощью Java 8, все в порядке, но создание его с помощью Java 11 завершается ошибкой компиляции:

package javax.xml.bind does not exist

Как мне исправить проблему?


person Boris    schedule 25.09.2018    source источник
comment
@Wolfgang, с такими взглядами на эволюцию программного обеспечения мы бы остались в эре Java 1.1. Я не могу полностью согласиться с мнением, высказанным в вашей вики. Да, они нарушили обещание обратной совместимости, но только для того, чтобы двигаться в ногу со временем.   -  person Boris    schedule 10.10.2019
comment
У меня ошибка: пакет javax.xml.bind не существует при запуске сборки maven с maven.compiler.source = 1.8 или version.java.source = 1.8 в poms, но java 11 установлен на консоли. Исправьте, установив локальную переменную env java_home в Java 8 SDK: установите java_home = path_to_java_8   -  person electrobabe    schedule 19.04.2021


Ответы (1)


Согласно примечания к выпуску, Java 11 удалила модули Java EE:

java.xml.bind (JAXB) - REMOVED
  • Java 8 - ОК
  • Java 9 - УСТАРЕЛО
  • Java 10 - УСТАРЕЛО
  • Java 11 - УДАЛЕНО

См. JEP 320 для получения дополнительной информации.

Вы можете решить эту проблему, используя альтернативные версии технологий Java EE. Просто добавьте зависимости Maven, содержащие нужные вам классы:

<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>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.3.0</version>
</dependency>

Обновление Jakarta EE 8 (март 2020 г.)

Вместо использования старых модулей JAXB вы можете решить проблему, используя Связывание Jakarta XML из Jakarta EE 8:

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>2.3.3</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.3.3</version>
  <scope>runtime</scope>
</dependency>

Обновление Jakarta EE 9 (ноябрь 2020 г.)

Используйте последнюю версию Jakarta XML Binding 3.0:

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>3.0.0</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>3.0.0</version>
  <scope>runtime</scope>
</dependency>

Примечание. Jakarta EE 9 использует новое пространство имен пакетов API jakarta.xml.bind.*, поэтому обновите операторы импорта:

javax.xml.bind -> jakarta.xml.bind
person Boris    schedule 25.09.2018
comment
Я наткнулся на этот ответ, пытаясь скомпилировать Java SDK для Fabric с Java 11. Спасибо! - person sivabudh; 25.12.2018
comment
Я обновляю приложение Spring Boot 2.1.0 до Java 11, но каждый раз, когда я запускаю JAR, он выводит: Ошибка при инициализации загрузочного слоя java.lang.module.FindException: модуль java.xml.bind не найден. Я добавил эти три зависимости, но безуспешно. Что еще требуется или что проверить? Я использую java 11.0.1. - person wsams; 03.01.2019
comment
@wsams вы используете модули Java? Вы обновили объявление модуля (module-info.java)? - person Boris; 04.01.2019
comment
Мне пришлось добавить указанные выше зависимости и удалить переключатель --add-modules = java.xml.bind из плагина компилятора maven. - person Lars Behnke; 19.02.2019
comment
@LarsBehnke, как выглядела ваша команда maven? Как добавить переключатель? - person Robbo_UK; 13.03.2019
comment
Версии неверные. Последние актуальные версии: jaxb-api: 2.3.1 jaxb-core: 2.2.11 jaxb-impl: 2.0.2 Вы можете проверить последние версии по адресу: mvnrepository.com/artifact/javax.xml.bind - person Juan García; 08.10.2019
comment
Поскольку Java SE и EE разделены, последняя называется Jakarta, и зависимости фактически больше не в com.sun.xml.bind, а в jakarta.xml.bind. Все, начиная с версии 2.3.2 и далее. Текущая версия xml-bind - 2.3.3. mvnrepository.com/artifact/jakarta.xml.bind - person kap; 24.03.2020
comment
@kap, спасибо, что указали на это, я обновил ответ с помощью Jakarta EE 8. - person Boris; 25.03.2020
comment
@Boris - Таким образом, использование зависимости Jakarta maven позволило мне успешно выполнить mvn generate-sources в моем проекте. Однако, когда я запускаю mvn install, я сталкиваюсь с такими ошибками сборки, как: javax.xml.bind.annotation does not exist. Есть предположения? - person ivan_drago; 15.04.2020
comment
@ivan_drago, можете ли вы попробовать добавить зависимость jaxb-runtime? <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.2</version> </dependency> - person Boris; 15.04.2020
comment
@Boris - Я добавил это и теперь получаю следующую ошибку: Caused by: java.lang.NoSuchFieldError: REFLECTION при запуске mvn generate-sources. Похоже, что последняя добавленная мной зависимость конфликтует с другой библиотекой, которая внедряется в другое место ...? - person ivan_drago; 15.04.2020
comment
Совместима ли Jakarta EE 8 с Java 10 и Java 11? - person Bionix1441; 14.10.2020
comment
@ Bionix1441 Java 10 - это EOL. Он совместим с Java 11, здесь является примером того, как для начальной загрузки проекта Jakarta EE 8 Maven. - person Boris; 14.10.2020
comment
Следуя рекомендациям марта 2020 года, приведенным выше, вы получите исключение javax.xml.bind.JAXBException: реализация JAXB-API не найдена в пути к модулю или пути к классам. - person Graham Leggett; 19.11.2020
comment
@Graham Leggett, спасибо, что указали на это, я обновил ответ с учетом зависимости реализации, совместимой с Jakarta EE 8. Также обновлен ответ с помощью Jakarta EE 9. - person Boris; 20.11.2020
comment
переключиться на java 1.8.0_261, поскольку 1.8.271.09 дает проблемы - person Devharsh Trivedi; 07.12.2020
comment
Куда вы добавляете эти вещи на Mac? - person N. Antonov; 11.01.2021
comment
Верно, у меня была Java 11 на моем домашнем пути, я переключился на 8 и мне удалось собрать свой проект (используя maven). Дополнительное примечание: я понизил 11 до 8 также в VS Code, но сохранил время выполнения, указывающее на 11, потому что это требуется IDE. Таким образом я построил проект, избавился от ошибок VS Code и по-прежнему мог использовать код Code для разработки. - person Cortex; 06.03.2021
comment
Сначала я не мог разрешить библиотеку jakarta в gradle. Добавление следующего репозитория помогло, url = 'repo1.maven.org/maven2' это может измениться позже - person Vortex; 08.03.2021
comment
Я не понимаю: последняя версия Java - это Java 8. Но люди говорят о Java 11. Кто-нибудь может дать мне таблицу, где объясняется управление версиями Java? - person fresko; 23.06.2021
comment
@fresko последняя версия Java - это не 8, а 16. См. План поддержки Oracle Java SE для получения дополнительных сведений. - person Boris; 23.06.2021