So lösen Sie java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException in Java 9


845

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?


2
Der zusätzliche Teil dieser Antwort bezieht sich auf die Migration dieser APIs.
Naman

7
Wenn Sie mit Java 8 erstellen, wird Ihr Code mit Ja kompiliert. Wenn Sie jedoch versuchen, diesen kompilierten Code auf Java 9+ auszuführen, schlägt dies fehl, da JAX-B nicht vorhanden ist.
Andy Guibert

1
Für Java 11 ist die Lösung dieses Artikels auf dem neuesten Stand: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang

Antworten:


1224

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.seAggregatmodul im Klassenpfad (oder besser gesagt im Modulpfad) verfügbar. Wie der Name schon sagt, enthält das java.seAggregatmodul 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:

java.activation
java.corba
java.transaction
java.xml.bind  << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation

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-modulesmit einem älteren JDK anzugeben , wird es gesprengt, da es sich um eine nicht erkannte Option handelt. Ich schlage eine von zwei Möglichkeiten vor:

  1. Sie können alle Optionen nur für Java 9+ mithilfe der JDK_JAVA_OPTIONSUmgebungsvariablen festlegen . Diese Umgebungsvariable wird vom Launcher für Java 9+ automatisch gelesenjava .
  2. Sie können das hinzufügen -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.eeOption angeben. Das java.se.eeModul ist ein Aggregatmodul, das java.se.eeneben den oben genannten Java EE-API-Modulen auch Module enthält. Beachten Sie, dass dies unter Java 11 nicht funktioniert, da java.se.eees 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-modulefunktioniert 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:

<!-- 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>

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.gradleDatei die folgenden Abhängigkeiten hinzu :

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"
}

8
Wenn die Java EE-API-Module als veraltet markiert sind, bedeutet dies möglicherweise, dass JAXB in Java 10 zur Laufzeit in Java 10 nicht mehr verfügbar ist? Das scheint ein Rückschritt zu sein. Wir müssen zur Praxis vor 6 zurückkehren, JAXB als Abhängigkeit einzubeziehen.
Michael

4
Die Verwendung von --add-modules java.se.ee oder --add-modules ALL-SYSTEM als Problemumgehung wird laut Migrationshandbuch hier nicht empfohlen. Docs.oracle.com/javase/9/migrate unter Abschnitt Mit Java EE nicht freigegebene Module Standardmäßig
behoben

6
Mit der offiziellen Veröffentlichung von Java 10 können wir bestätigen, dass die Methode zum Hinzufügen von Modulen weiterhin funktioniert. Die javax.xml.bindund andere JavaEE-Klassen sollen gemäß JEP-320 in Java 11 entfernt werden .
Joep Weijers

10
Und jetzt ist Java 11 freigegeben und das java.se.eeModul wurde entfernt, sodass die --add-modulesLösung nicht mehr funktioniert. Verwenden Sie stattdessen die empfohlene Lösung: Fügen Sie JAXB als separate Abhängigkeit hinzu.
Jesper

11
Ich habe diese Abhängigkeiten hinzugefügt und es gibt mir immer noch den gleichen Fehler. irgendwelche Ideen warum?
João Vieira

262

In meinem Fall (Spring Boot Fat Jar) füge ich einfach Folgendes zu pom.xml hinzu.

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>


9
Das Hinzufügen einer solchen Gradle-Abhängigkeit testCompile('javax.xml.bind:jaxb-api')hat bei mir funktioniert.
Pamcevoy

5
Wie bei @pamcevoy erwähnt, muss bei Verwendung von Spring Boot die Version von jaxb-api nicht angegeben werden. Boot verwaltet die Version automatisch.
Marcel Overdijk

2
Ich schlage vor, <scope>runtime</scope>für einen solchen Fall zu verwenden
VladS

5
@ Tunos Link hat bei mir nicht funktioniert, fester Link ist: github.com/spring-projects/spring-boot/wiki/…
Francisco Mateo

69

Keine 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:

<dependencies>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

2
Entfernen Sie für JDK 8 den Jaxb-Core und das Jaxb-Impl von oben.
foo

3
@Anil Dies ist eine pom.xmlDatei der Maven-Konfiguration. Wenn Sie nicht wissen, was das ist, dann ist es besser, von vorne zu beginnen
Andremoniy

8
Es ist ein illegaler Reflexionszugriff aufgetreten. WARNUNG: Unzulässiger Reflexionszugriff durch com.sun.xml.bind.v2.runtime.reflect.opt.Injector (Datei: / C: /Users/eis/.m2/repository/com/sun/). xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar) an die Methode java.lang.ClassLoader.defineClass (java.lang.String, Byte [], int, int) WARNUNG: Bitte beachten Sie Dies wird den Betreuern von com.sun.xml.bind.v2.runtime.reflect.opt.Injector gemeldet. WARNUNG: Verwenden Sie --illegal-access = warn, um Warnungen vor weiteren illegalen reflektierenden Zugriffsvorgängen zu aktivieren. WARNUNG: Alle illegalen Zugriffsvorgänge werden ausgeführt in einer zukünftigen Version verweigert
Stefan

1
Dies funktionierte für mich unter JDK 9.0.4 (ich habe JAXB-bezogenen Code über ein Maven-Plugin mit Maven 3.5.3 aufgerufen). Obwohl ich <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>als letzte Abhängigkeit verwenden würde.
Prüfung

1
Genial. Ich hatte eine Situation, in der aus irgendeinem Grund eine Spring-Boot-App in Intellij CE ausgeführt wurde, jedoch nicht in Eclipse auf dem Mac, und in Eclipse, jedoch nicht in Intellij CE unter Win10. Es ist von Vorteil, in einer IDE auf zwei Plattformen arbeiten zu können.
Kometen

42

Das hat bei mir funktioniert:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.7.0</version>
</dependency>

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

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
    <version>2.7.3</version>
</dependency>

Gradle

compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'

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:

System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");

Funktioniert bisher hervorragend als Problemumgehung. Sieht aber nicht nach einer perfekten Lösung aus ...


5
Das Hinzufügen org.eclipse.persistence:eclipselinknur, um JAXB-APIs zu erhalten, ist eine sehr schwere Abhängigkeit, es sei denn, Sie verwenden bereits Eclipselink?
Andy Guibert

4
Ja, es ist schwer (~ 9 MB) und ja, das habe ich schon benutzt. Ich habe erwähnt, dass dies lediglich eine alternative Problemumgehung für diejenigen ist, die, möglicherweise vorübergehend, sowohl 8 als auch 9 JREs für dasselbe Jar / War verwenden müssen, ohne Befehlszeilenargumente anzugeben.
Mikhail Kholodkov

2
Für die Interop zwischen JDK 8 und 9 würde ich empfehlen, die -XX:+IgnoreUnrecognizedVMOptionsBefehlszeilenoption zu verwenden (meine Antwort wurde mit Details aktualisiert)
Andy Guibert

System.setProperty ("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); funktioniert nicht für mich
David Brossard

1
Um eine Abhängigkeit von der gesamten EclipseLink-Bibliothek zu vermeiden, können Sie sich auch nur auf EclipseLink MOXy verlassen: groupId org.eclipse.persistence, artefaktId org.eclipse.persistence.moxy.
Jesper

36

saubere Lösung für alle JDKs> = 9

Sie müssen Ihrem Build zwei Abhängigkeiten hinzufügen

  • die jaxb-api
  • eine Jaxb-Implementierung

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

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.1</version>
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.1</version>
</dependency>

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 )


Wird das Modul javax.xml.bind wirklich benötigt? Mein Code in JDK 11 funktioniert ohne.
k.liakos

@ k.liakos Ich bin nicht sicher. Das Jaxb-Runtime-JAR und das API-JAR verwenden nicht dieselben Klassen / Pakete. Ich denke, es hängt von Ihrem Code ab. Wenn Ihr Code die Klassen aus dem Paket 'javax.xml.bind' nicht verwendet, benötigen Sie sie wahrscheinlich nicht. Das Thema dieses Threads ist, dass 'javax / xml / bind / JAXBException' nicht gefunden werden kann. Diese Klasse ist nur in der Jaxb-API.
Sebastian Thees

1
Funktioniert perfekt mit Multi-Modul-Projekt in Java 12.
Heril Muratovic

35

Es liegt daran, dass die Java-Version, wenn Sie JDK 9 oder eine neuere Version verwenden, diese einfach zu Ihrem POM hinzufügt

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>

1
Ich stoße die ganze Zeit mit den Spring Boot-Anleitungen darauf ... Vielen Dank.
Masterxilo

2
@Cesar Rodriguez T, ich habe dies mit einem Beispiel versucht und das Kompilieren hat funktioniert, aber das Laufen hat Fehler verursacht. Ich habe die ausgewählte Antwort verwendet, die mehr Abhängigkeiten enthielt, und das hat funktioniert.
PatS

Auf pom.xml Datei Ihres Projekts
Cesar Rodriguez T

22

Um dies zu lösen, habe ich einige JAR-Dateien in mein Projekt importiert:

  • javax.activation-1.2.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar

  • jaxb-api-2.3.0.jar

http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar

  • jaxb-core-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

  • jaxb-impl-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

  1. Laden Sie die obigen Dateien herunter und kopieren Sie sie in den libs-Ordner des Projekts
  2. Fügen Sie die importierten JAR-Dateien in Java Build Path hinzu

4
Beachten Sie, dass die com.sun.xml.bindArtefakte alt sind und nur aus Gründen der Abwärtskompatibilität bereitgestellt werden. Sie sollten org.glassfish.jaxbstattdessen die entsprechenden Artefakte verwenden, wie in einigen anderen Antworten erwähnt.
Jesper

Das hat bei mir nicht funktioniert. Es warf einen Fehler und sagte, dass es eine bestimmte Klasse nicht finden konnte.
RamenChef

Hat bei der Arbeit mit einer Grails 3.4.10-Anwendung für mich funktioniert, als ich sie in den Ordner tomcat9 / lib unter Mint 19.2 (Ubuntu 18.04-Basis) gestellt habe.
Mohamad Fakih

18

Fügen Sie zum Zeitpunkt der Kompilierung sowie zur Laufzeit den Schalter hinzu --add-modules java.xml.bind

javac --add-modules java.xml.bind <java file name>

java --add-modules java.xml.bind <class file>

Eine gute Einführung in die JDK 9Module finden Sie auch unter: https://www.youtube.com/watch?v=KZfbRuvv5qc


11

Das hat bei mir funktioniert. Nur jaxb-api hinzuzufügen war nicht genug.

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>

Und auf was war jaxb-api.version eingestellt?
Miguel Munoz

@ MiguelMunoz Ich benutzte 2.2.7
Mr Jedi

2
Beachten Sie, dass die com.sun.xml.bindArtefakte alt sind und nur aus Gründen der Abwärtskompatibilität bereitgestellt werden. Sie sollten org.glassfish.jaxbstattdessen die entsprechenden Artefakte verwenden, wie in einigen anderen Antworten erwähnt.
Jesper

11

Gehen Sie zu Your Build.gradle und fügen Sie die folgenden Abhängigkeiten für Java 9 oder Java 10 hinzu.

sourceCompatibility = 10 // You can also decrease your souce compatibility to 1.8 

//java 9+ does not have Jax B Dependents

    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
    compile group: 'javax.activation', name: 'activation', version: '1.1.1'

11

Mit der --add-modules=java.xml.bindJVM-Option können Sie der JVM-Laufzeitumgebung ein XML-Bindemodul hinzufügen.

Z.B: java --add-modules=java.xml.bind XmlTestClass


11

Update April 2019

Changelong für JAXB-Versionen finden Sie unter https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html

Auszüge:

    4.1. Changes between 2.3.0.1 and 2.4.0

         JAXB RI is now JPMS modularized:

            All modules have native module descriptor.

            Removed jaxb-core module, which caused split package issue on JPMS.

            RI binary bundle now has single jar per dependency instead of shaded fat jars.

            Removed runtime class weaving optimization.

    4.2. Changes between 2.3.0 and 2.3.0.1

          Removed legacy technology dependencies:

            com.sun.xml.bind:jaxb1-impl

            net.java.dev.msv:msv-core

            net.java.dev.msv:xsdlib

            com.sun.xml.bind.jaxb:isorelax

    4.3. Changes between 2.2.11 and 2.3.0

          Adopt Java SE 9:

            JAXB api can now be loaded as a module.

            JAXB RI is able to run on Java SE 9 from the classpath.

            Addes support for java.util.ServiceLoader mechanism.

            Security fixes

Der maßgebliche Link befindet sich unter https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

Maven-Koordinaten für JAXB-Artefakte

jakarta.xml.bind: jakarta.xml.bind-api: API-Klassen für JAXB. Erforderlich zum Kompilieren gegen JAXB.

org.glassfish.jaxb: jaxb-runtime: Implementierung von JAXB, Laufzeit für die Serialisierung und Deserialisierung von Java-Objekten in / von XML.

JAXB-Fettglasbündel:

com.sun.xml.bind: jaxb-impl: JAXB Laufzeit Fat Jar.

Im Gegensatz zu org.glassfish.jaxb-Artefakten sind in diesen Gläsern alle Abhängigkeitsklassen enthalten. Diese Artefakte enthalten keine JPMS-Moduldeskriptoren. In Maven-Projekten sollen stattdessen org.glassfish.jaxb-Artefakte verwendet werden.

org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 zieht ein:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
[INFO] |  +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO] |  +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
[INFO] |  +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
[INFO] |  +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
[INFO] |  \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile

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:

<profile>
    <id>java-9</id>
    <activation>
        <jdk>9</jdk>
    </activation>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
</profile> 

Der Abhängigkeitsbaum zeigt:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
[INFO] |  +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
[INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
[INFO] |  |  +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
[INFO] |  |  \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
[INFO] |  \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
[INFO] \- javax.activation:activation:jar:1.1.1:compile

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.


Vielen Dank, dass Sie gezeigt haben, dass eine Abhängigkeit für 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.
Basil Bourque


8

Fügen Sie die Abhängigkeit javax.xml.bind in pom.xml hinzu

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

8

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.

<properties>
  <jaxb.version>2.3.2</jaxb.version>
</properties>

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>${jaxb.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>${jaxb.version}</version>
</dependency>

7

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.

   <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>javax.activation-api</artifactId>
    <version>1.2.0</version>
</dependency>

7

Dies löste meine Probleme mit Abhängigkeiten, auf denen Apache Camel 2.24.1 unter Java 12 ausgeführt wird:

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0.1</version>
    </dependency>

In meinem Fall muss ich Tomcat-Abhängigkeit in
POM-

6

Ich habe das gleiche Problem bei der Verwendung von Spring Boot 2.0.5.RELEASEunter Java 11 festgestellt.

Das Hinzufügen javax.xml.bind:jaxb-api:2.3.0allein hat das Problem nicht behoben. Ich musste Spring Boot auch auf den neuesten Meilenstein aktualisieren 2.1.0.M2, daher gehe ich davon aus, dass dies in der nächsten offiziellen Version behoben wird.


Das klingt nicht nach mir. In diesem Thread gibt es mehrere Lösungen, die unabhängig von der Verwendung von Spring Boot 2 funktionieren. (Ich verwende übrigens auch Spring Boot 2.0.5.RELEASE.) Möglicherweise ist in Spring 2.1.0.M2 bereits eine Jaxb-Laufzeit enthalten.
Sebastian Thees

Es scheint, dass mit Spring Boot 2.1.0.RELEASE JAXB nicht mehr erforderlich ist - github.com/spring-projects/spring-boot/releases
Burrich

5

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‚s dependencies {}Block:

// Add missing dependencies for JDK 9+
if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
    // If you're using @AutoValue or any libs that requires javax.annotation (like Dagger)
    compileOnly 'com.github.pengrad:jdk9-deps:1.0'
    compileOnly 'javax.annotation:javax.annotation-api:1.3.2'

    // If you're using Kotlin
    kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
    kapt "javax.xml.bind:jaxb-api:2.3.1"
    kapt "com.sun.xml.bind:jaxb-impl:2.3.2"

    // If you're using Java
    annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"

    testAnnotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    testAnnotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
}

Funktioniert jedoch nicht für Unit-Tests
Malachiasz

Ich habe Ihre Antwort geändert, um auch mit Unit-Tests zu arbeiten.
Malachiasz

4

Ich bin auch über die ClassNotFoundException gestolpert: javax.xml.bind.DatatypeConverter mit Java 11 und

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

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

Java11 und jjwt 0.9.x und Sie haben das Problem ClassNotFoundException: javax.xml.bind.DatatypeConverter.

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.


3

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:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
        at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
        at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
        at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
        ...
        ..
        .
        ..
        ...
        at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more

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 ...

function extend_qzminynshg {
   local BASE="/usr/local/java"
   for LIB in jaxb-api.jar  jaxb-core.jar  jaxb-impl.jar  jaxb-jxc.jar  jaxb-xjc.jar; do
      local FQLIB="$BASE/jaxb-ri/lib/$LIB"
      if [[ -f $FQLIB ]]; then
         export CLASSPATH=$FQLIB:$CLASSPATH
      fi
    done
}

extend_qzminynshg; unset extend_qzminynshg

Und es funktioniert!


1
Ich verstehe die Downvotzes nicht. Anscheinend wollen die Leute mit Kommandozeilenoptionen herumspielen, anstatt tatsächlich die Gläser zu bekommen? Wie du willst.
David Tonhofer

7
Java-Entwickler verwenden normalerweise Build-Tools wie Gradle oder Maven, um Abhängigkeiten zu verwalten, anstatt Jars manuell herunterzuladen. Das ist wahrscheinlich der Grund für die Abstimmungen.
Joshua Davis

3

Sie benötigen nur 1 Abhängigkeit:

dependencies {
    implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")

2

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


2

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


2
Die Amazon Corretto-Distribution für JDK 11 bietet keine javax.xml.bind-Klassen. Wenn das Problem nach dem Wechsel zu Correto behoben wurde, lag es daran, dass Sie auf JDK 8 herabgestuft haben.
Andy Guibert

seltsam, ich werde überprüfen, in dem Docker habe ich Correto zuletzt verwendet
Armen Arzumanyan

Ja, amazoncorretto:latestderzeit 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 -> 11
Andy Guibert am

2

Die Abhängigkeitsversionen, die ich beim Kompilieren für das Java 8-Ziel verwenden musste. Getestete Anwendung in Java 8, 11 und 12 JREs.

        <!-- replace dependencies that have been removed from JRE's starting with Java v11 -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.8</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <!-- end replace dependencies that have been removed from JRE's starting with Java v11 -->

2

Für mich in Java 11 und gradle hat das geklappt:

plugins {
      id 'java'
}

dependencies {
      runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}

wo genau setzen wir das?
Nyxee

In Ihrer build.gradle-Datei, wenn Sie gradle verwenden.
silver_mx

1

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.

<!-- API -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>

1

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


Bitte erwägen Sie, mindestens den Teil der Lösung in Ihre Antwort aufzunehmen, da Nur-Link-Antworten ungültig werden, wenn sich die URL in Zukunft ändert.
Yukashima Huksay

0

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!


2
Während dies OP helfen kann, ist es besser, mehr Details, Beispiele usw. hinzuzufügen
Tiw

0

Wenn Sie SOAP-Webdienste aufrufen (z. B. verwenden jaxws-maven-plugin), indem Sie diese Abhängigkeit hinzufügen, verschwinden alle JAXB-Fehler:

<dependency>
            <groupId>org.glassfish.metro</groupId>
            <artifactId>webservices-rt</artifactId>
            <version>2.4.3</version>
</dependency>

Getestet mit Java 13

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.