Die JAXB-APIs werden als Java EE-APIs betrachtet und sind daher in Java SE 9 nicht mehr im Standardklassenpfad enthalten. In Java 11 werden sie vollständig aus dem JDK entfernt.
Java 9 führt die Konzepte von Modulen ein, und standardmäßig ist das java.se
Aggregatmodul im Klassenpfad (oder besser gesagt im Modulpfad) verfügbar. Wie der Name schon sagt, enthält das java.se
Aggregatmodul nicht die Java EE-APIs, die traditionell mit Java 6/7/8 gebündelt wurden.
Glücklicherweise befinden sich diese Java EE-APIs, die in JDK 6/7/8 bereitgestellt wurden, noch im JDK, befinden sich jedoch standardmäßig nicht im Klassenpfad. Die zusätzlichen Java EE-APIs werden in den folgenden Modulen bereitgestellt:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Schnelle und schmutzige Lösung: (nur JDK 9/10)
Geben Sie die folgende Befehlszeilenoption an, um die JAXB-APIs zur Laufzeit verfügbar zu machen:
--add-modules java.xml.bind
Aber ich brauche das immer noch, um mit Java 8 zu arbeiten !!!
Wenn Sie versuchen, --add-modules
mit einem älteren JDK anzugeben , wird es gesprengt, da es sich um eine nicht erkannte Option handelt. Ich schlage eine von zwei Möglichkeiten vor:
- Sie können alle Optionen nur für Java 9+ mithilfe der
JDK_JAVA_OPTIONS
Umgebungsvariablen festlegen . Diese Umgebungsvariable wird vom Launcher für Java 9+ automatisch gelesenjava
.
- Sie können das hinzufügen
-XX:+IgnoreUnrecognizedVMOptions
, damit die JVM nicht erkannte Optionen stillschweigend ignoriert, anstatt sie in die Luft zu jagen. Aber Vorsicht! Alle anderen von Ihnen verwendeten Befehlszeilenargumente werden von der JVM nicht mehr für Sie validiert. Diese Option funktioniert sowohl mit Oracle / OpenJDK als auch mit IBM JDK (ab JDK 8sr4).
Alternative schnelle Lösung: (nur JDK 9/10)
Beachten Sie, dass Sie alle oben genannten Java EE-Module zur Laufzeit verfügbar machen können, indem Sie die --add-modules java.se.ee
Option angeben. Das java.se.ee
Modul ist ein Aggregatmodul, das java.se.ee
neben den oben genannten Java EE-API-Modulen auch Module enthält. Beachten Sie, dass dies unter Java 11 nicht funktioniert, da java.se.ee
es in Java 11 entfernt wurde.
Richtige langfristige Lösung: (JDK 9 und höher)
Die Java EE API - Module oben aufgelistet sind alle markiert , @Deprecated(forRemoval=true)
weil sie für die Entfernung geplant in Java 11 . Daher --add-module
funktioniert der Ansatz in Java 11 nicht mehr sofort.
In Java 11 und höher müssen Sie lediglich Ihre eigene Kopie der Java EE-APIs in den Klassen- oder Modulpfad aufnehmen. Beispielsweise können Sie die JAX-B-APIs wie folgt als Maven-Abhängigkeit hinzufügen:
<!-- 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>
Weitere Informationen zu JAXB finden Sie auf der Seite JAXB-Referenzimplementierung .
Ausführliche Informationen zur Java-Modularität finden Sie in JEP 261: Module System
Für Gradle- oder Android Studio-Entwickler: (JDK 9 und höher)
Fügen Sie Ihrer build.gradle
Datei die folgenden Abhängigkeiten hinzu :
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"
}