J'ai du code qui utilise des classes d'API JAXB qui ont été fournies dans le cadre du JDK en Java 6/7/8. Lorsque j'exécute le même code avec Java 9, lors de l'exécution, j'obtiens des erreurs indiquant que les classes JAXB sont introuvables.
Les classes JAXB sont fournies dans le cadre du JDK depuis Java 6, alors pourquoi Java 9 ne peut-il plus trouver ces classes?
Réponses:
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, lejava.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:
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:JDK_JAVA_OPTIONS
variable d'environnement. Cette variable d'environnement est automatiquement lue par lejava
lanceur pour Java 9+.-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. Lejava.se.ee
module est un module agrégé qui inclutjava.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:
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:la source
javax.xml.bind
classes JavaEE et autres doivent être supprimées dans Java 11, conformément à JEP-320 .java.se.ee
module a été supprimé, donc la--add-modules
solution ne fonctionne plus. Utilisez plutôt la solution recommandée: ajoutez JAXB en tant que dépendance distincte.Dans mon cas (pot de graisse de démarrage de printemps), j'ajoute simplement ce qui suit à pom.xml.
la source
testCompile('javax.xml.bind:jaxb-api')
fonctionné pour moi.<scope>runtime</scope>
pour un tel casAucune de ces solutions n'a bien fonctionné pour moi dans le récent JDK 9.0.1.
J'ai trouvé que cette liste de dépendances est suffisante pour un bon fonctionnement, vous n'avez donc pas besoin de spécifier explicitement
--add-module
(bien qu'elle soit spécifiée dans les pom de ces dépendances). Il vous suffit de spécifier cette liste de dépendances:la source
pom.xml
fichier de la configuration Maven. Si vous ne savez pas ce que c'est, alors il vaut mieux commencer par commencer<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>
comme dernière dépendance.Cela a fonctionné pour moi:
Mise à jour
Comme l'a suggéré @Jasper, afin d'éviter de dépendre de l'ensemble de la bibliothèque EclipseLink, vous pouvez également simplement dépendre d'EclipseLink MOXy:
Maven
Gradle
Comme dépendances pour mon application Java 8, qui produit un * .jar qui peut être exécuté par JRE 8 ou JRE 9 sans arguments supplémentaires.
De plus, cela doit être exécuté quelque part avant que l'API JAXB soit utilisée:
Fonctionne très bien jusqu'à présent, comme solution de contournement. Cela ne semble pas être une solution parfaite ...
la source
org.eclipse.persistence:eclipselink
juste pour obtenir les API JAXB est une dépendance très lourde, à moins que vous n'utilisiez déjà eclipselink?-XX:+IgnoreUnrecognizedVMOptions
option de ligne de commande (mise à jour de ma réponse avec des détails)org.eclipse.persistence
, artifactIdorg.eclipse.persistence.moxy
.solution propre pour tous les JDK> = 9
Vous devez ajouter deux dépendances à votre build
En tant qu'implémentation, j'ai choisi d'utiliser l'implémentation de référence par glassfish pour se débarrasser des anciennes classes / bibliothèques com.sun. Donc, par conséquent, j'ai ajouté dans ma version maven
Notez qu'à partir de la version 2.3.1, vous n'avez plus besoin d'ajouter le javax.activation. (voir https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )
la source
c'est parce que la version java si vous utilisez jdk 9 ou une version plus récente il suffit de l'ajouter à votre pom
la source
Pour résoudre ce problème, j'ai importé des fichiers JAR dans mon projet:
http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
la source
com.sun.xml.bind
artefacts sont anciens et fournis uniquement à des fins de compatibilité descendante. Vous devez utiliser à laorg.glassfish.jaxb
place les artefacts équivalents , comme mentionné dans certaines des autres réponses.Au moment de la compilation et de l'exécution, ajoutez le commutateur
--add-modules java.xml.bind
Une bonne introduction des
JDK 9
modules peut également être trouvée sur: https://www.youtube.com/watch?v=KZfbRuvv5qcla source
Cela a fonctionné pour moi. Ajouter seulement jaxb-api n'était pas suffisant.
la source
com.sun.xml.bind
artefacts sont anciens et fournis uniquement à des fins de compatibilité descendante. Vous devez utiliser à laorg.glassfish.jaxb
place les artefacts équivalents , comme mentionné dans certaines des autres réponses.Accédez à Your Build.gradle et ajoutez les dépendances ci-dessous pour Java 9 ou Java 10.
la source
Vous pouvez utiliser l'
--add-modules=java.xml.bind
option JVM pour ajouter un module de liaison xml à l'environnement d'exécution JVM.Par exemple:
java --add-modules=java.xml.bind XmlTestClass
la source
Mise à jour avril 2019
Changelong pour les versions JAXB se trouve à https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html
extraits:
Le lien faisant autorité est à https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 tire:
Réponse originale
A la suite Quels artefacts dois - je utiliser pour JAXB RI dans mon projet Maven? dans Maven, vous pouvez utiliser un profil comme:
L'arbre de dépendance montre:
Pour l'utiliser dans Eclipse, dites Oxygen.3a Release (4.7.3a) ou version ultérieure, Ctrl-Alt-P, ou cliquez avec le bouton droit sur le projet, Maven, puis sélectionnez le profil.
la source
javax.xml.bind
>jaxb-api
que j'ai vue ailleurs est en fait redondante. La dépendance du glassfish le tire. Je viens d'essayer cela, et cela fonctionne effectivement.Pour l'exécution de Java Web Start, nous pouvons utiliser la suggestion d'Andy Guibert comme ceci:
Notez le "=" supplémentaire dans les modules --add. Consultez ce ticket OpenJDK ou la dernière note dans "Understanding Runtime Access Warnings" du Java Platform, Standard Edition Oracle JDK 9 Migration Guide .
la source
ajouter la dépendance javax.xml.bind dans pom.xml
la source
Comme JavaEE est désormais régi par https://jakarta.ee/ , les nouvelles coordonnées Maven à partir de 2.3.2 sont:
https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts
La première version jaxb.version publiée est la 2.3.2.
la source
J'ai suivi cette URL et les paramètres ci-dessous m'ont vraiment aidé. J'utilise Java 10 avec STS IDE dans Macbook Pro. Il fonctionne comme un charme.
la source
Cela a résolu mes problèmes avec les dépendances exécutant Apache Camel 2.24.1 sur Java 12:
la source
J'ai rencontré le même problème en utilisant Spring Boot
2.0.5.RELEASE
sur Java 11.L'ajout
javax.xml.bind:jaxb-api:2.3.0
seul n'a pas résolu le problème. J'ai également dû mettre à jour Spring Boot vers la dernière Milestone2.1.0.M2
, donc je suppose que cela sera corrigé dans la prochaine version officielle.la source
Vous devez ajouter des dépendances JAX-B lors de l'utilisation de JDK 9+. Pour les utilisateurs Android Studio, vous devrez ajouter à votre
build.gradle
de »dependencies {}
bloc:la source
J'ai également trébuché sur l'exception ClassNotFoundException: javax.xml.bind.DatatypeConverter à l'aide de Java 11 et
J'ai essayé toutes ces choses autour de l'ajout de javax.xml.bind: jaxb-api ou spring boot jakarta.xml.bind-api .. J'ai trouvé un indice pour les correctifs dans la version jjwt 0.10.0 .. mais surtout, le package jjwt est maintenant divisé!
Vérifiez donc cette référence: https://github.com/jwtk/jjwt/issues/510
Simplement, si vous utilisez
allez pour
jjwt version 0.11.x, mais utilisez les packages fractionnés: https://github.com/jwtk/jjwt#install
Vous ne trouverez pas de version supérieure pour la dépendance jjwt, car ils divisent les packages.
À votre santé.
la source
Pas une réponse, mais un addendum: je l'ai parce que l'exécution
groovysh
(Groovy 2.4.13) si JAVA_HOME pointe vers une installation de Java 9 (java version "9.0.1"
pour être précis) échoue de façon catastrophique:La solution était de:
Accédez au projet JAXB sur github.io ( "JAXB est autorisé sous une double licence - CDDL 1.1 et GPL 2.0 avec exception de chemin de classe" )
Télécharger
jaxb-ri-2.3.0.zip
Décompressez où vous placez vos fichiers d'infrastructure java (dans mon cas,
/usr/local/java/jaxb-ri/
). Une autre solution peut exister (peut-être via SDKMAN, je ne sais pas)Assurez-vous que les fichiers jar du sous-répertoire lib se trouvent sur le
CLASSPATH
. Je le fais via un script démarré au démarrage de bash, appelé/etc/profile.d/java.sh
, où j'ai ajouté (parmi beaucoup d'autres lignes) la boucle suivante:Emballé dans une fonction ...
Et il fonctionne!
la source
Vous n'avez besoin que d'une seule dépendance:
la source
OK, j'ai eu le même genre de problème, mais j'utilisais Java 8, et n'arrêtais pas d'obtenir cette erreur, j'ai essayé la plupart des solutions. mais il s'avère que mon maven pointait toujours vers java 9 même si j'ai défini la version globale de Java sur 8, dès que j'ai corrigé que tout fonctionnait.
Pour tous ceux qui pourraient avoir ce genre de problème, consultez Comment réparer Maven pour utiliser Java par défaut
la source
Ancienne réponse "Problème résolu en passant à amazoncorretto" Nouvelle réponse: J'ai utilisé le corretto le plus récent, mais il est similaire au jdk 1.8. de toute façon, nous devons ajouter des dépendances manuellement
la source
amazoncorretto:latest
donne actuellement JDK 8, pas 11. De nombreuses images Docker sont toujours basées sur JDK 8, précisément en raison des problèmes de compatibilité causés par la suppression de l'API entre JDK 8 -> 11Les versions de dépendance que j'avais besoin d'utiliser lors de la compilation pour la cible Java 8. Application testée dans Java 8, 11 et 12 JRE.
la source
Pour moi, en Java 11 et gradle, c'est ce qui a fonctionné:
la source
Vous devez ajouter des dépendances jaxb à maven. La version 2.3.2 de l'implémentation de Glassfish est parfaitement compatible avec la nouvelle version 2.3.2 de l'API jaxarta EE jaxb.
la source
J'ai eu des problèmes similaires après la mise à niveau de mon projet vers Java 11, puis ce qui l'a corrigé était la mise à niveau vers Spring Boot 2.1.1 qui a apparemment un support pour Java 11, cela a aidé
la source
Je sais que je suis en retard à la fête, mais mon erreur a fini par nécessiter une solution différente ... super simple aussi
Au départ, j'ai dépoli Tomcat 9 et j'ai réalisé que j'avais besoin de 7 ... J'ai oublié de mapper mon chemin de classe vers la version 7 dans build.xml
J'espère que cela corrigera une erreur elses à l'avenir, qui réussit à ignorer ce problème simple comme je l'ai fait!
la source
Si vous appelez des services Web SOAP (par exemple, en utilisant
jaxws-maven-plugin
) simplement en ajoutant cette dépendance, toutes les erreurs JAXB disparaissent:Testé avec Java 13
la source