API JAXB вважаються API Java EE, і тому вони більше не містяться на класному шляху за замовчуванням у Java SE 9. У Java 11 вони повністю видаляються з JDK.
Java 9 представляє поняття модулів, і за замовчуванням java.se
агрегатний модуль доступний на classpath (а точніше, модуль-шлях). Як випливає з назви, java.se
модуль агрегації не включає API Java EE, які традиційно постачаються з Java 6/7/8.
На щастя, ці API Java EE, які були надані в JDK 6/7/8, все ще знаходяться в JDK, але вони просто не знаходяться на класному шляху за замовчуванням. Додаткові API EE Java надаються в наступних модулях:
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)
Щоб зробити API JAXB доступними під час виконання, вкажіть наступний варіант командного рядка:
--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 на шляху classpath або модуля. Наприклад, ви можете додати 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"
}