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 предоставляются в следующих модулях:
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, он взорвется, потому что это нераспознанная опция. Я предлагаю один из двух вариантов:
- Вы можете установить любые опции Java 9+, используя
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, например так:
<!-- 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.
Для получения полной информации о модульности Java см. JEP 261: Модульная система
Для разработчиков Gradle или Android Studio: (JDK 9 и выше)
Добавьте следующие зависимости в ваш build.gradle
файл:
dependencies {
// JAX-B dependencies for JDK 9+
implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}