Les API JAXB sont considérées comme des API Java EE et ne figurent donc plus dans le classpath 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, la fonction java.se
Le module d'agrégation est disponible dans le classpath (ou plutôt le module-path). Comme son nom l'indique, le module java.se
Le module d'agrégation fait no incluent les API Java EE qui ont été traditionnellement regroupées avec Java 6/7/8.
Heureusement, ces API Java EE qui étaient fournies dans le JDK 6/7/8 sont toujours dans le JDK, mais elles ne sont pas sur le classpath 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 seulement)
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'ai encore besoin que cela fonctionne avec Java 8 ! !!
Si vous essayez de spécifier --add-modules
avec un JDK plus ancien, il va exploser parce que c'est une option non reconnue. Je suggère l'une des deux options suivantes :
- Vous pouvez définir n'importe quelle option réservée à Java 9+ en utilisant l'option
JDK_JAVA_OPTIONS
variable d'environnement. Cette variable d'environnement est lu automatiquement par le java
pour Java 9+.
- Vous pouvez ajouter le
-XX:+IgnoreUnrecognizedVMOptions
pour que la JVM ignore silencieusement les options non reconnues, au lieu d'exploser. Mais attention ! 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).
Autre solution rapide : (JDK 9/10 uniquement)
Notez que vous pouvez rendre tous les modules Java EE susmentionnés disponibles au moment de l'exécution en spécifiant l'attribut --add-modules java.se.ee
option. Le site java.se.ee
est un module agrégé qui comprend java.se.ee
ainsi que les modules API Java EE ci-dessus. Remarque, cette ne fonctionne pas sur Java 11 parce que java.se.ee
a été supprimé dans Java 11.
Solution appropriée à long terme : (JDK 9 et au-delà)
Les modules API Java EE énumérés ci-dessus sont tous marqués @Deprecated(forRemoval=true)
parce qu'ils sont prévue pour le déménagement sur Java 11 . Ainsi, le --add-module
ne fonctionnera plus dans Java 11 prêt à l'emploi.
À partir de Java 11, vous devrez inclure votre propre copie des API Java EE dans le classpath ou le chemin des modules. 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 la référence JAXB pour plus de détails sur JAXB.
Pour plus de détails sur la modularité de Java, voir JEP 261 : Système de modules
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"
}
2 votes
La partie supplémentaire dans cette réponse concerne la migration de ces API.
9 votes
Si vous construisez avec Java 8, votre code sera compilé, mais si vous essayez d'exécuter ce code compilé sur Java 9+, il échouera car JAX-B n'est pas présent.
2 votes
Pour Java 11, la solution de cet article est à jour : crunchify.com/java-11-et-javax-xml-bind-jaxbcontext
0 votes
Voir wiki.bitplan.com/index.php/Java8
0 votes
Cela répond-il à votre question ? Remplacement des modules JPMS obsolètes par des API Java EE
0 votes
Regarde comment je l'ai réparé :- Réponse :