Interfejsy API JAXB są uważane za interfejsy API Java EE i dlatego nie są już zawarte w domyślnej ścieżce klas w Java SE 9. W Javie 11 są one całkowicie usuwane z JDK.
Java 9 wprowadza koncepcje modułów i domyślnie java.se
moduł agregujący jest dostępny na ścieżce klasy (a raczej ścieżce modułu). Jak sama nazwa wskazuje, java.se
moduł agregujący nie zawiera interfejsów API Java EE, które były tradycyjnie pakowane w Javę 6/7/8.
Na szczęście te interfejsy API Java EE, które zostały udostępnione w JDK 6/7/8, nadal znajdują się w JDK, ale domyślnie nie znajdują się w ścieżce klas. Dodatkowe interfejsy API Java EE znajdują się w następujących modułach:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Szybkie i brudne rozwiązanie: (tylko JDK 9/10)
Aby interfejsy API JAXB były dostępne w czasie wykonywania, określ następującą opcję wiersza polecenia:
--add-modules java.xml.bind
Ale nadal potrzebuję tego do pracy z Javą 8 !!!
Jeśli spróbujesz podać --add-modules
starszy JDK, zostanie on wysadzony, ponieważ jest to nierozpoznana opcja. Proponuję jedną z dwóch opcji:
- Możesz ustawić dowolne opcje tylko Java 9+, używając
JDK_JAVA_OPTIONS
zmiennej środowiskowej. Ta zmienna środowiskowa jest automatycznie odczytywana przez program java
uruchamiający dla Java 9+.
- Możesz dodać,
-XX:+IgnoreUnrecognizedVMOptions
aby JVM dyskretnie ignorował nierozpoznane opcje, zamiast wysadzać w powietrze. Ale strzeż się! Wszelkie inne argumenty wiersza polecenia, których użyjesz, nie będą już dla ciebie sprawdzane przez JVM. Ta opcja działa z Oracle / OpenJDK oraz IBM JDK (od JDK 8sr4).
Alternatywne szybkie rozwiązanie: (tylko JDK 9/10)
Pamiętaj, że możesz udostępnić wszystkie powyższe moduły Java EE w czasie wykonywania, określając tę --add-modules java.se.ee
opcję. java.se.ee
Moduł jest modułem, który zawiera kruszywa java.se.ee
, jak również wyżej wymienionych modułów Java EE API. Uwaga: nie działa to w Javie 11, ponieważ java.se.ee
została usunięta w Javie 11.
Właściwe rozwiązanie długoterminowe: (JDK 9 i nowsze)
Wszystkie wymienione wyżej moduły API Java EE są oznaczone, @Deprecated(forRemoval=true)
ponieważ ich usunięcie zaplanowano w Javie 11 . Dlatego --add-module
podejście nie będzie już działać w Javie 11 od razu po wyjęciu z pudełka.
W języku Java 11 i nowszych wersjach należy umieścić własną kopię interfejsów API Java EE na ścieżce klasy lub ścieżce modułu. Na przykład możesz dodać interfejsy API JAX-B jako zależność Maven, taką jak ta:
<!-- 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>
Patrz strona Reference Implementation JAXB więcej szczegółów na JAXB.
Aby uzyskać szczegółowe informacje na temat modułowości Java, zobacz JEP 261: Moduł systemu
Dla programistów Gradle lub Android Studio: (JDK 9 i nowsze wersje)
Dodaj następujące zależności do build.gradle
pliku:
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"
}