Le API JAXB sono considerate API Java EE e pertanto non sono più contenute nel percorso di classe predefinito in Java SE 9. In Java 11, vengono completamente rimosse da JDK.
Java 9 introduce i concetti di moduli e, per impostazione predefinita, il java.se
modulo aggregato è disponibile sul percorso di classe (o meglio, percorso del modulo). Come suggerisce il nome, il java.se
modulo aggregato non include le API Java EE che sono state tradizionalmente raggruppate con Java 6/7/8.
Fortunatamente, queste API Java EE fornite in JDK 6/7/8 sono ancora nel JDK, ma per impostazione predefinita non sono sul percorso di classe. Le API Java EE extra sono fornite nei seguenti moduli:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Soluzione rapida e sporca: (solo JDK 9/10)
Per rendere disponibili le API JAXB in fase di runtime, specificare la seguente opzione della riga di comando:
--add-modules java.xml.bind
Ma ho ancora bisogno di questo per funzionare con Java 8 !!!
Se provi a specificare --add-modules
un JDK più vecchio, esploderà perché è un'opzione non riconosciuta. Suggerisco una delle due opzioni:
- È possibile impostare qualsiasi opzione solo Java 9+ utilizzando la
JDK_JAVA_OPTIONS
variabile di ambiente. Questa variabile di ambiente viene letta automaticamente dal programma di java
avvio per Java 9+.
- È possibile aggiungere il
-XX:+IgnoreUnrecognizedVMOptions
per fare in modo che JVM ignori silenziosamente le opzioni non riconosciute, invece di esplodere. Ma attenzione! Eventuali altri argomenti della riga di comando utilizzati non verranno più convalidati dalla JVM. Questa opzione funziona con Oracle / OpenJDK e IBM JDK (a partire da JDK 8sr4).
Soluzione rapida alternativa: (solo JDK 9/10)
Si noti che è possibile rendere disponibili tutti i moduli Java EE sopra indicati in fase di esecuzione specificando l' --add-modules java.se.ee
opzione. Il java.se.ee
modulo è un modulo aggregato che include java.se.ee
i suddetti moduli API Java EE. Nota, questo non funziona su Java 11 perché è java.se.ee
stato rimosso in Java 11.
Corretta soluzione a lungo termine: (JDK 9 e oltre)
I moduli API Java EE sopra elencati sono tutti contrassegnati @Deprecated(forRemoval=true)
perché sono programmati per la rimozione in Java 11 . Quindi l' --add-module
approccio non funzionerà più in Java 11 immediatamente.
Quello che dovrete fare in Java 11 e successivi è includere la vostra copia delle API Java EE sul percorso di classe o sul modulo. Ad esempio, è possibile aggiungere le API JAX-B come dipendenza Maven in questo modo:
<!-- 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>
Vedere la pagina di implementazione di riferimento JAXB per maggiori dettagli su JAXB.
Per i dettagli completi sulla modularità di Java, consultare JEP 261: Module System
Per gli sviluppatori Gradle o Android Studio: (JDK 9 e successivi)
Aggiungi le seguenti dipendenze al tuo build.gradle
file:
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"
}