Jak rozwiązać błąd java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException w Javie 9

842

Mam kod, który używa klas API JAXB, które zostały dostarczone jako część JDK w Javie 6/7/8. Gdy uruchamiam ten sam kod z Javą 9, w czasie wykonywania pojawiają się błędy wskazujące, że nie można znaleźć klas JAXB.

Klasy JAXB są dostarczane jako część JDK od Java 6, więc dlaczego Java 9 nie może już znaleźć tych klas?

Andy Guibert
źródło
2
Dodatkowa część tej odpowiedzi dotyczy migracji tych interfejsów API.
Naman
7
budowanie z Javą 8 spowoduje kompilację kodu tak, ale kiedy spróbujesz uruchomić ten skompilowany kod na Javie 9+, zakończy się niepowodzeniem, ponieważ JAX-B nie jest obecny.
Andy Guibert
1
W przypadku języka Java 11 rozwiązanie tego artykułu jest aktualne: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang
patrz wiki.bitplan.com/index.php/Java8
Wolfgang Fahl

Odpowiedzi:

1222

Interfejsy API JAXB są uważane za interfejsy API Java EE i dlatego nie są już zawarte w domyślnej ścieżce klas w Java SE 9. W Javie 11 są one całkowicie usuwane z JDK.

Java 9 wprowadza koncepcje modułów i domyślnie java.semoduł agregujący jest dostępny na ścieżce klasy (a raczej ścieżce modułu). Jak sama nazwa wskazuje, java.semoduł agregujący nie zawiera interfejsów API Java EE, które były tradycyjnie pakowane w Javę 6/7/8.

Na szczęście te interfejsy API Java EE, które zostały udostępnione w JDK 6/7/8, nadal znajdują się w JDK, ale domyślnie nie znajdują się w ścieżce klas. Dodatkowe interfejsy API Java EE znajdują się w następujących modułach:

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

Szybkie i brudne rozwiązanie: (tylko JDK 9/10)

Aby interfejsy API JAXB były dostępne w czasie wykonywania, określ następującą opcję wiersza polecenia:

--add-modules java.xml.bind

Ale nadal potrzebuję tego do pracy z Javą 8 !!!

Jeśli spróbujesz podać --add-modulesstarszy JDK, zostanie on wysadzony, ponieważ jest to nierozpoznana opcja. Proponuję jedną z dwóch opcji:

  1. Możesz ustawić dowolne opcje tylko Java 9+, używając JDK_JAVA_OPTIONSzmiennej środowiskowej. Ta zmienna środowiskowa jest automatycznie odczytywana przez program javauruchamiający dla Java 9+.
  2. Możesz dodać, -XX:+IgnoreUnrecognizedVMOptionsaby JVM dyskretnie ignorował nierozpoznane opcje, zamiast wysadzać w powietrze. Ale strzeż się! Wszelkie inne argumenty wiersza polecenia, których użyjesz, nie będą już dla ciebie sprawdzane przez JVM. Ta opcja działa z Oracle / OpenJDK oraz IBM JDK (od JDK 8sr4).

Alternatywne szybkie rozwiązanie: (tylko JDK 9/10)

Pamiętaj, że możesz udostępnić wszystkie powyższe moduły Java EE w czasie wykonywania, określając tę --add-modules java.se.eeopcję. java.se.eeModuł jest modułem, który zawiera kruszywa java.se.ee, jak również wyżej wymienionych modułów Java EE API. Uwaga: nie działa to w Javie 11, ponieważ java.se.eezostała usunięta w Javie 11.


Właściwe rozwiązanie długoterminowe: (JDK 9 i nowsze)

Wszystkie wymienione wyżej moduły API Java EE są oznaczone, @Deprecated(forRemoval=true)ponieważ ich usunięcie zaplanowano w Javie 11 . Dlatego --add-modulepodejście nie będzie już działać w Javie 11 od razu po wyjęciu z pudełka.

W języku Java 11 i nowszych wersjach należy umieścić własną kopię interfejsów API Java EE na ścieżce klasy lub ścieżce modułu. Na przykład możesz dodać interfejsy API JAX-B jako zależność Maven, taką jak ta:

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

Patrz strona Reference Implementation JAXB więcej szczegółów na JAXB.

Aby uzyskać szczegółowe informacje na temat modułowości Java, zobacz JEP 261: Moduł systemu

Dla programistów Gradle lub Android Studio: (JDK 9 i nowsze wersje)

Dodaj następujące zależności do build.gradlepliku:

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"
}
Andy Guibert
źródło
8
Jeśli więc moduły interfejsu API Java EE są oznaczone jako przestarzałe, oznacza to, że w Javie 10 JAXB nie będzie już dostępny w środowisku uruchomieniowym w Javie 10? To wydaje się krokiem wstecz. Będziemy musieli wrócić do praktyki sprzed 6, obejmującej JAXB jako zależność.
Michael
4
Korzystanie z opcji --add-modules java.se.ee lub --add-modules ALL-SYSTEM jako obejścia nie jest zalecane zgodnie z przewodnikiem dotyczącym migracji tutaj docs.oracle.com/javase/9/migrate w sekcji Moduły współdzielone z Java EE Nie Rozwiązane domyślnie -> punkt 1
justMe
6
Po oficjalnym wydaniu Java 10 możemy potwierdzić, że metoda add-moduły nadal będzie działać. Te javax.xml.bindi inne zajęcia JavaEE są zaplanowane do usunięcia w Javie 11, za JEP-320 .
Joep Weijers
10
A teraz Java 11 została wydana, a java.se.eemoduł został usunięty, więc --add-modulesrozwiązanie już nie działa. Zamiast tego użyj zalecanego rozwiązania: dodaj JAXB jako osobną zależność.
Jesper
11
dodałem te zależności i nadal daje mi ten sam błąd. jakieś pomysły dlaczego?
João Vieira
262

W moim przypadku (słoik z grubym bootem) po prostu dodaję następujący tekst do pom.xml.

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
jdev
źródło
10
Tylko dla odniesienia github.com/spring-projects/spring-boot/wiki/…
Tuno
9
Dodanie takiej zależności zależało testCompile('javax.xml.bind:jaxb-api')ode mnie.
pamcevoy
5
Jak wspomniano @pamcevoy, nie ma potrzeby określania wersji jaxb-api podczas korzystania z Spring Boot. Boot automatycznie zarządza wersją.
Marcel Overdijk
2
Proponuję użyć <scope>runtime</scope>do takiego przypadku
VladS
5
Link @ Tuno nie działał dla mnie, naprawiony link to: github.com/spring-projects/spring-boot/wiki/…
Francisco Mateo
69

Żadne z tych rozwiązań nie działało dla mnie dobrze w ostatnim JDK 9.0.1.

Odkryłem, że ta lista zależności jest wystarczająca do prawidłowego funkcjonowania, więc nie trzeba jawnie określać --add-module(chociaż jest ona określona w pom pom tych zależności). Wystarczy tylko podać tę listę zależności:

<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>
Andremoniy
źródło
2
W przypadku JDK 8 usuń jaxb-core i jaxb-impl z góry.
foo
3
@ Tylko to jest pom.xmlplik konfiguracji Maven. Jeśli nie wiesz, co to jest, lepiej zacząć od początku
Andremoniy
8
Wystąpiła nielegalna operacja dostępu odblaskowego OSTRZEŻENIE: Nielegalny dostęp odblaskowy przez com.sun.xml.bind.v2.runtime.reflect.opt.Injector (plik: / C: /Users/eis/.m2/repository/com/sun/ xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar) do metody java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int) OSTRZEŻENIE: Należy rozważyć zgłaszanie tego do opiekunów com.sun.xml.bind.v2.runtime.reflect.opt.Injector OSTRZEŻENIE: Użyj --illegal-access = warn, aby włączyć ostrzeżenia o dalszych nielegalnych operacjach dostępu odblaskowego OSTRZEŻENIE: Wszystkie nielegalne operacje dostępu będą odmowa w przyszłym wydaniu
Stefan
1
Działa to dla mnie w JDK 9.0.4 (dzwoniłem do kodu związanego z JAXB przez wtyczkę Maven z Maven 3.5.3). Chociaż użyłbym <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>jako ostatniej zależności.
scrutari
1
Niesamowite. Miałem sytuację, w której - z jakiegoś powodu - aplikacja do rozruchu wiosennego działałaby w Intellij CE, ale nie w Eclipse na Macu, i w Eclipse, ale nie Intellij CE na Win10. Zaletą jest możliwość pracy w jednym środowisku IDE na dwóch platformach.
kometen
42

To działało dla mnie:

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

Aktualizacja

Jak sugerował @Jasper, aby uniknąć zależności od całej biblioteki EclipseLink, możesz także polegać na EclipseLink MOXy:

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'

Jako zależności dla mojej aplikacji Java 8, która tworzy plik * .jar, który może być uruchamiany zarówno przez JRE 8, jak i JRE 9 bez dodatkowych argumentów.

Ponadto należy to gdzieś wykonać, zanim zostanie użyty interfejs API JAXB:

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

Jak dotąd działa świetnie jako obejście. Nie wygląda to jednak na idealne rozwiązanie ...

Michaił Chołodkow
źródło
5
dodawanie org.eclipse.persistence:eclipselinktylko w celu uzyskania interfejsów API JAXB jest bardzo ciężką zależnością, chyba że już używasz eclipselink?
Andy Guibert
4
Tak, jest ciężki (~ 9mb) i tak, już go używałem. Wspomniałem, że jest to po prostu alternatywne obejście dla tych, którzy, być może tymczasowi, będą musieli użyć zarówno 8, jak i 9 JRE dla tego samego jar / war bez podawania argumentów wiersza poleceń.
Michaił Chołodkow
2
ze względu na interop między JDK 8 i 9 zalecałbym użycie -XX:+IgnoreUnrecognizedVMOptionsopcji wiersza poleceń (zaktualizowałem moją odpowiedź o szczegóły)
Andy Guibert
System.setProperty („javax.xml.bind.JAXBContextFactory”, „org.eclipse.persistence.jaxb.JAXBContextFactory”); nie działa dla mnie
David Brossard
1
Aby uniknąć uzależnienia od całej biblioteki EclipseLink, możesz także polegać na EclipseLink MOXy: groupId org.eclipse.persistence, artefactId org.eclipse.persistence.moxy.
Jesper
36

czyste rozwiązanie dla wszystkich JDK> = 9

Musisz dodać dwie zależności do swojej kompilacji

  • jaxb-api
  • implementacja jaxb

Jako implementację postanowiłem użyć implementacji referencyjnej przez glassfish, aby pozbyć się starych klas / bibliotek com.sun. W rezultacie dodałem w swojej wersji maven

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

Zauważ, że od wersji 2.3.1 nie musisz już dodawać javax.activation. (patrz https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )

Sebastian Thees
źródło
Czy moduł javax.xml.bind jest naprawdę wymagany? Mój kod w JDK 11 działa bez niego.
k.liakos
@ k.liakos Nie jestem pewien. Słoik środowiska wykonawczego jaxb i słoik interfejsu API nie współużytkują tych samych klas / pakietów. Myślę, że to zależy od twojego kodu. Jeśli twój kod nie używa klas z pakietu „javax.xml.bind”, prawdopodobnie nie potrzebujesz go. Tematem tego wątku jest to, że nie można znaleźć „javax / xml / bind / JAXBException”; ta klasa jest tylko w jaxb-api.
Sebastian Thees,
1
Doskonale współpracuje z projektem wielomodułowym w Javie 12.
Heril Muratovic
35

to dlatego, że wersja Java, jeśli używasz jdk 9 lub nowszej wersji, po prostu dodaj to do pom

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>
Cesar Rodriguez T.
źródło
1
Cały czas wpadam na to z przewodnikami Spring Boot ... Dzięki tona.
masterxilo,
2
@Cesar Rodriguez T, próbowałem tego na swaggerowym przykładzie i kompilacja działała, ale uruchamianie dawało błędy. Użyłem wybranej odpowiedzi, która obejmowała więcej zależności i działała.
PatS
Na pliku pom.xml twojego projektu
Cesar Rodriguez T
22

Aby rozwiązać ten problem, zaimportowałem niektóre pliki JAR w moim projekcie:

  • 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. Pobierz powyższe pliki i skopiuj je do folderu libs w projekcie
  2. Dodaj importowane pliki JAR do Ścieżki kompilacji Java
Fábio Nascimento
źródło
4
Zwróć uwagę, że com.sun.xml.bindartefakty są stare i zostały dostarczone wyłącznie w celu zachowania zgodności wstecznej. Zamiast tego należy użyć równoważnych org.glassfish.jaxbartefaktów, jak wspomniano w niektórych innych odpowiedziach.
Jesper
To nie działało dla mnie. Zgłoszył błąd i powiedział, że nie może znaleźć konkretnej klasy.
RamenChef
Działa dla mnie, gdy umieszczam je w folderze tomcat9 / lib pod Mint 19.2 (baza Ubuntu 18.04), podczas wdrażania aplikacji Grails 3.4.10.
Mohamad Fakih,
18

W momencie kompilacji, a także w czasie wykonywania, dodaj przełącznik --add-modules java.xml.bind

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

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

Dobre wprowadzenie JDK 9modułów można również znaleźć na stronie : https://www.youtube.com/watch?v=KZfbRuvv5qc

Pallavi Sonal
źródło
11

To zadziałało dla mnie. Dodanie tylko jaxb-api nie wystarczyło.

        <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>
Pan Jedi
źródło
A do czego ustawiono jaxb-api.version?
MiguelMunoz,
@MiguelMunoz Użyłem 2.2.7
Pan Jedi
2
Zwróć uwagę, że com.sun.xml.bindartefakty są stare i zostały dostarczone wyłącznie w celu zachowania zgodności wstecznej. Zamiast tego należy użyć równoważnych org.glassfish.jaxbartefaktów, jak wspomniano w niektórych innych odpowiedziach.
Jesper
11

Przejdź do swojego Build.gradle i dodaj poniższe zależności dla Java 9 lub Java 10.

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'
Kumar Abhishek
źródło
11

Możesz użyć --add-modules=java.xml.bindOpcji JVM aby dodać moduł powiązania xml do środowiska wykonawczego JVM.

Na przykład: java --add-modules=java.xml.bind XmlTestClass

Jayesh Jayanthivasan
źródło
11

Aktualizacja kwietnia 2019 r

Changelong dla wydań JAXB jest na https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html

fragmenty:

    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

Autorytatywny link znajduje się na https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

Współrzędne Maven dla artefaktów JAXB

jakarta.xml.bind: jakarta.xml.bind-api: klasy API dla JAXB. Wymagany do kompilacji z JAXB.

org.glassfish.jaxb: jaxb-runtime: Implementacja JAXB, środowisko wykonawcze używane do serializacji i deserializacji obiektów java do / z xml.

Pakiety słoików tłuszczu JAXB:

com.sun.xml.bind: jaxb-impl: JAXB runtime fat jar.

W przeciwieństwie do artefaktów org.glassfish.jaxb słoiki te zawierają wszystkie klasy zależności. Te artefakty nie zawierają deskryptorów modułów JPMS. W projektach Maven zamiast tego należy używać artefaktów org.glassfish.jaxb.

org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 wciąga:

[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

Oryginalna odpowiedź

Po jakich artefaktach powinienem użyć JAXB RI w moim projekcie Maven? w Maven możesz użyć profilu takiego jak:

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

Drzewo zależności pokazuje:

[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

Aby użyć tego w Eclipse, powiedz Oxygen.3a Release (4.7.3a) lub nowszy, Ctrl-Alt-P, lub kliknij prawym przyciskiem myszy projekt, Maven, a następnie wybierz profil.

JasonPlutext
źródło
Dzięki za pokazanie, że zależność dla javax.xml.bind> jaxb-api, którą widziałam gdzie indziej, jest w rzeczywistości zbędna. Ciągnie to zależność od ryb szklistych. Właśnie tego spróbowałem i rzeczywiście działa.
Basil Bourque,
8

W przypadku Java Web Start Execution możemy użyć sugestii Andy'ego Guiberta w następujący sposób:

<j2se version="1.6+" 
      java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>

Zwróć uwagę na dodatkowe „=” w --add-module. Zobacz ten bilet OpenJDK lub ostatnią uwagę w „Zrozumieniu ostrzeżeń dotyczących dostępu do środowiska wykonawczego” platformy Java, Standard Edition Oracle JDK 9 Migration Guide .

mvw
źródło
8

dodaj zależność javax.xml.bind w pom.xml

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
malith vitha
źródło
8

Ponieważ JavaEE jest teraz zarządzany przez https://jakarta.ee/ , nowe współrzędne Maven od 2.3.2 to:

https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts

Pierwsza wydana wersja jaxb.version to 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>
dschulten
źródło
7

Śledziłem ten adres URL i poniższe ustawienia naprawdę mi pomogły. Używam Java 10 z STS IDE w Macbook Pro. To działa jak urok.

   <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>
itsraghz
źródło
7

To rozwiązało moje problemy z zależnościami uruchomionymi Apache Camel 2.24.1 na Javie 12:

    <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>
Kachanow
źródło
w moim przypadku muszę dodać zależność tomcat w pliku pom
GvSharma
6

Ten sam problem napotkałem podczas korzystania z Spring Boot 2.0.5.RELEASEw Javie 11.

Samo dodanie javax.xml.bind:jaxb-api:2.3.0nie rozwiązało problemu. Musiałem także zaktualizować Spring Boot do najnowszego Milestone 2.1.0.M2, więc zakładam, że zostanie to naprawione w następnej oficjalnej wersji.

Javide
źródło
Nie dotyczy to mnie. W tym wątku jest kilka rozwiązań, które działają niezależnie od używania Spring Boot 2. (Używam również Spring Boot 2.0.5. RELEASE btw). Być może wiosną 2.1.0.M2 jest już włączone środowisko uruchomieniowe Javy.
Sebastian Thees,
Wygląda na to, że w przypadku wersji Spring Boot 2.1.0 WYDANIE, JAXB nie jest już konieczne - github.com/spring-projects/spring-boot/releases
Burrich
5

Musisz dodać zależności JAX-B podczas korzystania z JDK 9+. Dla Android Studio użytkownikiem, musisz dodać do swojej build.gradle„s dependencies {}bloku:

// 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"
}
Hieu Rocker
źródło
Nie działa jednak w przypadku testów jednostkowych
Malachiasz
Zmodyfikowałem również twoją odpowiedź, aby działała również z testami jednostkowymi.
Malachiasz
4

Natknąłem się również na wyjątek ClassNotFoundException: javax.xml.bind.DatatypeConverter przy użyciu Java 11 i

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

Próbowałem wszystkich tych rzeczy, dodając javax.xml.bind: jaxb-api lub spring boot jakarta.xml.bind-api .. Znalazłem wskazówkę dotyczącą poprawek w wersji jjwt 0.10.0 .. ale co najważniejsze, pakiet jjwt to teraz podzielone!

Dlatego sprawdź to odniesienie: https://github.com/jwtk/jjwt/issues/510

Po prostu, jeśli używasz

Java11 i jjwt 0.9.x, a ty napotykasz wyjątek ClassNotFoundException: javax.xml.bind.DatatypeConverter,

idź po

jjwt wersja 0.11.x, ale użyj podzielonych pakietów: https://github.com/jwtk/jjwt#install

Nie można znaleźć wyższej wersji dla zależności jjwt, ponieważ dzielą pakiety.

Twoje zdrowie.

rico_s
źródło
3

Nie odpowiedź, ale dodatek: Dostałem, ponieważ uruchamianie groovysh(Groovy 2.4.13), jeśli JAVA_HOME wskazuje na instalację Java 9 ( java version "9.0.1"a konkretnie) kończy się fatalnie:

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

Rozwiązaniem było:

  • Przejdź do projektu JAXB na github.io ( „JAXB jest licencjonowany na podstawie podwójnej licencji - CDDL 1.1 i GPL 2.0 z wyjątkiem ścieżki klasy” )

  • Pobieranie jaxb-ri-2.3.0.zip

  • Rozpakuj, gdziekolwiek umieścisz pliki infrastruktury Java (w moim przypadku, /usr/local/java/jaxb-ri/). Inne rozwiązanie może istnieć (może przez SDKMAN, nie wiem)

  • Upewnij się, że słoiki w podkatalogu lib znajdują się w CLASSPATH. Robię to za pomocą skryptu uruchomionego przy starcie basha, zwanego /etc/profile.d/java.sh, w którym dodałem (między innymi wierszami) następującą pętlę:

Pakowane w funkcję ...

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

I to działa!

David Tonhofer
źródło
1
Nie rozumiem downvotzesów. Najwyraźniej ludzie chcą przeszukiwać opcje wiersza poleceń zamiast kupować słoiki? Dopasuj się.
David Tonhofer,
7
Programiści Java zwykle używają narzędzi do budowania, takich jak Gradle lub Maven, do zarządzania zależnościami, a nie ręcznie pobierają słoiki. To prawdopodobnie jest powód, dla którego głosy są odrzucone.
Joshua Davis
3

Potrzebujesz tylko 1 zależności:

dependencies {
    implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")
Dmitrij Kaltovich
źródło
2

OK, miałem ten sam problem, ale używałem Java 8 i ciągle otrzymywałem ten błąd, wypróbowałem większość rozwiązań. ale okazuje się, że mój maven wciąż wskazuje Java 9, mimo że ustawiłem globalną wersję Java na 8, gdy tylko ustaliłem, że wszystko działa.

Dla każdego, kto może mieć tego rodzaju problem, sprawdź Jak naprawić Maven, aby używał domyślnej Java

Ipkiss
źródło
2

Stara odpowiedź „Problem rozwiązany przez przejście na amazoncorretto” Odpowiedź na wiadomość: Użyłem najnowszej wersji corretto, ale jest podobny jdk 1.8. więc i tak potrzebujemy dodać zależności ręcznie

Armen Arzumanyan
źródło
2
Dystrybucja Amazon Corretto dla JDK 11 nie zapewnia klas javax.xml.bind. Jeśli problem został rozwiązany po przejściu na Correto, to dlatego, że obniżyłeś wersję do JDK 8.
Andy Guibert
dziwne, sprawdzę, w oknie dokowanym użyłem ostatnio correto
Armen Arzumanyan
Tak, amazoncorretto:latestobecnie daje JDK 8, a nie 11. Wiele obrazów Dockera nadal opiera się na JDK 8, właśnie z powodu problemów z kompatybilnością spowodowanych usunięciem interfejsu API między JDK 8 -> 11
Andy Guibert
2

Wersje zależności, których musiałem użyć podczas kompilacji pod docelową wersję Java 8. Testowana aplikacja w środowiskach JRE Java 8, 11 i 12.

        <!-- 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 -->
Chris
źródło
2

Dla mnie w Javie 11 i stopniach to się udało:

plugins {
      id 'java'
}

dependencies {
      runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}
silver_mx
źródło
gdzie dokładnie to umieszczamy?
nyxee
Jeśli używasz gradle w pliku build.gradle.
silver_mx
1

Musisz dodać zależności mavb do maven. Wersja implementacyjna glassfish 2.3.2 jest doskonale kompatybilna z nową wersją interfejsu API jakarta EE jaxb api 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>
krishna Telgave
źródło
1

miałem podobne problemy po uaktualnieniu mojego projektu do java 11, a następnie to, co naprawiłem, to uaktualnienie do wersji spring boot 2.1.1, która najwyraźniej obsługuje java 11, to pomogło

FreakAtNs
źródło
rozważ dodanie co najmniej części rozwiązania w swojej odpowiedzi, ponieważ odpowiedzi tylko z linkiem staną się nieprawidłowe, jeśli adres URL zmieni się w przyszłości.
yukashima huksay
0

Wiem, że spóźniłem się na imprezę, ale mój błąd ostatecznie wymagał innego rozwiązania ... również bardzo prostego

Oryginalnie rozłożyłem się na Tomcat 9 i zdałem sobie sprawę, że potrzebuję 7 ... Zapomniałem zmapować ścieżkę swojej klasy z powrotem do wersji 7 w build.xml

Mam nadzieję, że naprawi to błąd w przyszłości, któremu uda się przeoczyć ten prosty problem, tak jak ja!

Tyler Miles
źródło
2
Chociaż może to pomóc OP, lepiej dodać więcej szczegółów, przykładów itp.
Tiw
0

Jeśli wywołujesz usługi sieciowe SOAP (na przykład za pomocą jaxws-maven-plugin), dodając tę ​​zależność, wszystkie błędy JAXB znikają:

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

Testowane z Javą 13

GabrielBB
źródło