Les API JAXB sont considérées comme des API Java EE et ne sont donc plus contenues dans le chemin de classe par défaut dans Java SE 9. Dans Java 11, elles sont complètement supprimées du JDK.
Java 9 introduit les concepts de modules, et par défaut, le java.se
module d'agrégation est disponible sur le chemin de classe (ou plutôt, chemin de module). Comme son nom l'indique, le java.se
module d'agrégation n'inclut pas les API Java EE qui étaient traditionnellement regroupées avec Java 6/7/8.
Heureusement, ces API Java EE fournies dans le JDK 6/7/8 sont toujours dans le JDK, mais elles ne sont tout simplement pas sur le chemin de classe par défaut. Les API Java EE supplémentaires sont fournies dans les modules suivants:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Solution rapide et sale: (JDK 9/10 uniquement)
Pour rendre les API JAXB disponibles au moment de l'exécution, spécifiez l'option de ligne de commande suivante:
--add-modules java.xml.bind
Mais j'en ai encore besoin pour travailler avec Java 8 !!!
Si vous essayez de spécifier --add-modules
avec un JDK plus ancien, il explosera car il s'agit d'une option non reconnue. Je suggère l'une des deux options:
- Vous pouvez définir toutes les options Java 9+ uniquement à l'aide de la
JDK_JAVA_OPTIONS
variable d'environnement. Cette variable d'environnement est automatiquement lue par le java
lanceur pour Java 9+.
- Vous pouvez ajouter le
-XX:+IgnoreUnrecognizedVMOptions
pour que la JVM ignore silencieusement les options non reconnues, au lieu de sauter. Mais méfiez-vous! Tout autre argument de ligne de commande que vous utilisez ne sera plus validé pour vous par la JVM. Cette option fonctionne avec Oracle / OpenJDK ainsi qu'avec IBM JDK (à partir de JDK 8sr4).
Solution rapide alternative: (JDK 9/10 uniquement)
Notez que vous pouvez rendre tous les modules Java EE ci-dessus disponibles au moment de l'exécution en spécifiant l' --add-modules java.se.ee
option. Le java.se.ee
module est un module agrégé qui inclut java.se.ee
ainsi que les modules API Java EE ci-dessus. Remarque, cela ne fonctionne pas sur Java 11 carjava.se.ee
été supprimé dans Java 11.
Solution appropriée à long terme: (JDK 9 et au-delà)
Les modules API Java EE répertoriés ci-dessus sont tous marqués @Deprecated(forRemoval=true)
car leur suppression est planifiée dans Java 11 . Alors le--add-module
approche ne fonctionnera donc plus dans Java 11 prêt à l'emploi.
Ce que vous devrez faire dans Java 11 et plus tard, c'est inclure votre propre copie des API Java EE sur le chemin de classe ou le chemin du module. Par exemple, vous pouvez ajouter les API JAX-B en tant que dépendance Maven comme ceci:
<!-- 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>
Voir le page de mise en œuvre de référence JAXB pour plus de détails sur JAXB.
Pour plus de détails sur la modularité Java, voir JEP 261: Module System
Pour les développeurs Gradle ou Android Studio: (JDK 9 et au-delà)
Ajoutez les dépendances suivantes à votre build.gradle
fichier:
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"
}