Ich habe Code, der JAXB-API-Klassen verwendet, die als Teil des JDK in Java 6/7/8 bereitgestellt wurden. Wenn ich denselben Code mit Java 9 ausführe, werden zur Laufzeit Fehler angezeigt, die darauf hinweisen, dass JAXB-Klassen nicht gefunden werden können.
Die JAXB-Klassen werden seit Java 6 als Teil des JDK bereitgestellt. Warum kann Java 9 diese Klassen nicht mehr finden?
Antworten:
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 dasjava.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:
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:JDK_JAVA_OPTIONS
Umgebungsvariablen festlegen . Diese Umgebungsvariable wird vom Launcher für Java 9+ automatisch gelesenjava
.-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. Dasjava.se.ee
Modul ist ein Aggregatmodul, dasjava.se.ee
neben den oben genannten Java EE-API-Modulen auch Module enthält. Beachten Sie, dass dies unter Java 11 nicht funktioniert, dajava.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:
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 :quelle
javax.xml.bind
und andere JavaEE-Klassen sollen gemäß JEP-320 in Java 11 entfernt werden .java.se.ee
Modul wurde entfernt, sodass die--add-modules
Lösung nicht mehr funktioniert. Verwenden Sie stattdessen die empfohlene Lösung: Fügen Sie JAXB als separate Abhängigkeit hinzu.In meinem Fall (Spring Boot Fat Jar) füge ich einfach Folgendes zu pom.xml hinzu.
quelle
testCompile('javax.xml.bind:jaxb-api')
hat bei mir funktioniert.<scope>runtime</scope>
für einen solchen Fall zu verwendenKeine dieser Lösungen hat in JDK 9.0.1 für mich gut funktioniert.
Ich habe festgestellt, dass diese Liste von Abhängigkeiten für ein ordnungsgemäßes Funktionieren ausreicht, sodass Sie sie nicht explizit angeben müssen
--add-module
(obwohl sie in den Poms dieser Abhängigkeiten angegeben ist). Sie müssen lediglich diese Liste der Abhängigkeiten angeben:quelle
pom.xml
Datei der Maven-Konfiguration. Wenn Sie nicht wissen, was das ist, dann ist es besser, von vorne zu beginnen<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>
als letzte Abhängigkeit verwenden würde.Das hat bei mir funktioniert:
Aktualisieren
Wie @Jasper vorgeschlagen hat, können Sie sich auch einfach auf EclipseLink MOXy verlassen, um eine Abhängigkeit von der gesamten EclipseLink-Bibliothek zu vermeiden:
Maven
Gradle
Als Abhängigkeiten für meine Java 8-App, die eine * .jar erzeugt, die sowohl von JRE 8 als auch von JRE 9 ohne zusätzliche Argumente ausgeführt werden kann.
Darüber hinaus muss dies irgendwo ausgeführt werden, bevor die JAXB-API verwendet wird:
Funktioniert bisher hervorragend als Problemumgehung. Sieht aber nicht nach einer perfekten Lösung aus ...
quelle
org.eclipse.persistence:eclipselink
nur, um JAXB-APIs zu erhalten, ist eine sehr schwere Abhängigkeit, es sei denn, Sie verwenden bereits Eclipselink?-XX:+IgnoreUnrecognizedVMOptions
Befehlszeilenoption zu verwenden (meine Antwort wurde mit Details aktualisiert)org.eclipse.persistence
, artefaktIdorg.eclipse.persistence.moxy
.saubere Lösung für alle JDKs> = 9
Sie müssen Ihrem Build zwei Abhängigkeiten hinzufügen
Als Implementierung habe ich mich für die Referenzimplementierung von glassfish entschieden, um alte Klassen / Bibliotheken von com.sun zu entfernen. Als Ergebnis habe ich in meinem Maven Build hinzugefügt
Beachten Sie, dass Sie ab Version 2.3.1 die javax.activation nicht mehr hinzufügen müssen. (siehe https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )
quelle
Es liegt daran, dass die Java-Version, wenn Sie JDK 9 oder eine neuere Version verwenden, diese einfach zu Ihrem POM hinzufügt
quelle
Um dies zu lösen, habe ich einige JAR-Dateien in mein Projekt importiert:
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
quelle
com.sun.xml.bind
Artefakte alt sind und nur aus Gründen der Abwärtskompatibilität bereitgestellt werden. Sie solltenorg.glassfish.jaxb
stattdessen die entsprechenden Artefakte verwenden, wie in einigen anderen Antworten erwähnt.Fügen Sie zum Zeitpunkt der Kompilierung sowie zur Laufzeit den Schalter hinzu
--add-modules java.xml.bind
Eine gute Einführung in die
JDK 9
Module finden Sie auch unter: https://www.youtube.com/watch?v=KZfbRuvv5qcquelle
Das hat bei mir funktioniert. Nur jaxb-api hinzuzufügen war nicht genug.
quelle
com.sun.xml.bind
Artefakte alt sind und nur aus Gründen der Abwärtskompatibilität bereitgestellt werden. Sie solltenorg.glassfish.jaxb
stattdessen die entsprechenden Artefakte verwenden, wie in einigen anderen Antworten erwähnt.Gehen Sie zu Your Build.gradle und fügen Sie die folgenden Abhängigkeiten für Java 9 oder Java 10 hinzu.
quelle
Mit der
--add-modules=java.xml.bind
JVM-Option können Sie der JVM-Laufzeitumgebung ein XML-Bindemodul hinzufügen.Z.B:
java --add-modules=java.xml.bind XmlTestClass
quelle
Update April 2019
Changelong für JAXB-Versionen finden Sie unter https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html
Auszüge:
Der maßgebliche Link befindet sich unter https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 zieht ein:
Ursprüngliche Antwort
Folgen Welche Artefakte sollte ich für JAXB RI in meinem Maven-Projekt verwenden? In Maven können Sie ein Profil wie das folgende verwenden:
Der Abhängigkeitsbaum zeigt:
Um dies in Eclipse zu verwenden, sagen Sie Oxygen.3a Release (4.7.3a) oder höher, Strg-Alt-P, oder klicken Sie mit der rechten Maustaste auf das Projekt Maven, und wählen Sie dann das Profil aus.
quelle
javax.xml.bind
>jaxb-api
, die ich an anderer Stelle gesehen habe, tatsächlich überflüssig ist. Die Glasfischabhängigkeit zieht es. Ich habe es gerade versucht, und es funktioniert tatsächlich.Für die Ausführung von Java Web Start können wir den Vorschlag von Andy Guibert wie folgt verwenden:
Beachten Sie das zusätzliche "=" in den --add-Modulen. Weitere Informationen finden Sie in diesem OpenJDK-Ticket oder im letzten Hinweis unter "Grundlegendes zu Laufzeitzugriffswarnungen" der Java Platform, Standard Edition Oracle JDK 9-Migrationshandbuch .
quelle
Fügen Sie die Abhängigkeit javax.xml.bind in pom.xml hinzu
quelle
Da JavaEE jetzt von https://jakarta.ee/ geregelt wird , die neuen Maven-Koordinaten ab 2.3.2:
https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts
Die erste veröffentlichte jaxb.version ist 2.3.2.
quelle
Ich folgte dieser URL und die folgenden Einstellungen hatten mir wirklich geholfen. Ich verwende Java 10 mit STS IDE in Macbook Pro. Es wirkt wie ein Zauber.
quelle
Dies löste meine Probleme mit Abhängigkeiten, auf denen Apache Camel 2.24.1 unter Java 12 ausgeführt wird:
quelle
Ich habe das gleiche Problem bei der Verwendung von Spring Boot
2.0.5.RELEASE
unter Java 11 festgestellt.Das Hinzufügen
javax.xml.bind:jaxb-api:2.3.0
allein hat das Problem nicht behoben. Ich musste Spring Boot auch auf den neuesten Meilenstein aktualisieren2.1.0.M2
, daher gehe ich davon aus, dass dies in der nächsten offiziellen Version behoben wird.quelle
Sie müssen JAX-B-Abhängigkeiten hinzufügen, wenn Sie JDK 9+ verwenden. Für Android Studio - Benutzer, müssen Sie dies Ihren hinzuzufügen
build.gradle
‚sdependencies {}
Block:quelle
Ich bin auch über die ClassNotFoundException gestolpert: javax.xml.bind.DatatypeConverter mit Java 11 und
Ich habe all diese Dinge ausprobiert, um javax.xml.bind hinzuzufügen: jaxb-api oder spring boot jakarta.xml.bind-api. Ich habe einen Hinweis für Korrekturen in jjwt Version 0.10.0 gefunden. Am wichtigsten ist jedoch das jjwt-Paket jetzt spalten!
Überprüfen Sie daher diese Referenz: https://github.com/jwtk/jjwt/issues/510
Einfach, wenn Sie verwenden
geh für
jjwt Version 0.11.x, aber verwenden Sie die aufgeteilten Pakete: https://github.com/jwtk/jjwt#install
Sie werden keine höhere Version für die JJWT-Abhängigkeit finden, da sie die Pakete aufteilen.
Prost.
quelle
Keine Antwort, sondern ein Nachtrag: Ich habe es bekommen, weil das Ausführen
groovysh
(Groovy 2.4.13), wenn JAVA_HOME auf eine Java 9-Installation verweist (java version "9.0.1"
um genau zu sein), miserabel fehlschlägt:Die Lösung war:
Gehen Sie zum JAXB-Projekt unter github.io ( "JAXB ist unter einer Doppellizenz lizenziert - CDDL 1.1 und GPL 2.0 mit Klassenpfadausnahme" )
Herunterladen
jaxb-ri-2.3.0.zip
Entpacken Sie überall dort, wo Sie Ihre Java-Infrastrukturdateien ablegen (in meinem Fall
/usr/local/java/jaxb-ri/
). Möglicherweise gibt es eine andere Lösung (möglicherweise über SDKMAN, ich weiß nicht)Stellen Sie sicher, dass sich die Gläser im Unterverzeichnis lib im befinden
CLASSPATH
. Ich mache es über ein Skript, das beim Bash-Start gestartet wurde und aufgerufen wurde/etc/profile.d/java.sh
, wobei ich (neben vielen anderen Zeilen) die folgende Schleife hinzugefügt habe:In eine Funktion gepackt ...
Und es funktioniert!
quelle
Sie benötigen nur 1 Abhängigkeit:
quelle
OK, ich hatte das gleiche Problem, aber ich habe Java 8 verwendet und immer wieder diesen Fehler erhalten. Ich habe die meisten Lösungen ausprobiert. Es stellte sich jedoch heraus, dass mein Maven immer noch auf Java 9 zeigte, obwohl ich die globale Java-Version auf 8 gesetzt hatte, sobald ich behoben hatte, dass alles funktionierte.
Für alle, die diese Art von Problem haben könnten, lesen Sie Wie man Maven repariert, um Standard-Java zu verwenden
quelle
Alte Antwort "Problem durch Umschalten auf amazoncorretto behoben" Antwort der Nachrichten: Ich habe das neueste Corretto verwendet, aber es ist ähnlich wie JDK 1.8. Daher müssen wir Abhängigkeiten manuell hinzufügen
quelle
amazoncorretto:latest
derzeit gibt es JDK 8, nicht 11. Viele Docker-Images basieren immer noch auf JDK 8, gerade wegen der Kompatibilitätsprobleme, die durch das Entfernen der API zwischen JDK 8 -> 11Die Abhängigkeitsversionen, die ich beim Kompilieren für das Java 8-Ziel verwenden musste. Getestete Anwendung in Java 8, 11 und 12 JREs.
quelle
Für mich in Java 11 und gradle hat das geklappt:
quelle
Sie müssen Javen Jaxb-Abhängigkeiten hinzufügen. Die Glassfish-Implementierungsversion 2.3.2 ist perfekt kompatibel mit der neuen jakarta EE jaxb api Version 2.3.2.
quelle
Ich hatte ähnliche Probleme, nachdem ich mein Projekt auf Java 11 aktualisiert hatte. Was dann behoben wurde, war das Upgrade auf Spring Boot 2.1.1, das anscheinend Java 11 unterstützt. Dies half
quelle
Ich weiß, dass ich zu spät zur Party komme, aber mein Fehler brauchte eine andere Lösung ... auch super einfach
Ich habe mich ursprünglich für Tomcat 9 entschieden und festgestellt, dass ich 7 benötige ... Ich habe vergessen, meinen Klassenpfad wieder der 7-Version in build.xml zuzuordnen
Hoffentlich behebt dies in Zukunft einen anderen Fehler, der es schafft, dieses einfache Problem so zu übersehen wie ich!
quelle
Wenn Sie SOAP-Webdienste aufrufen (z. B. verwenden
jaxws-maven-plugin
), indem Sie diese Abhängigkeit hinzufügen, verschwinden alle JAXB-Fehler:Getestet mit Java 13
quelle