Як вирішити java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException на Java 9


842

У мене є код, який використовує API API JAXB, які були надані як частина JDK в Java 6/7/8. Коли я запускаю той самий код з Java 9, під час виконання я отримую помилки, які вказують на те, що класи JAXB не можна знайти.

Класи JAXB пропонуються як частина JDK з Java 6, тому чому Java 9 більше не може знайти ці класи?


2
Додаткова частина у цій відповіді стосується міграції цих API.
Наман

7
при створенні Java 8 ваш код буде компілювати так, але якщо ви спробуєте запустити цей скомпільований код на Java 9+, він вийде з ладу, оскільки JAX-B відсутній.
Енді Гіберт

1
Для Java 11 рішення цієї статті оновлено: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang

Відповіді:


1223

API JAXB вважаються API Java EE, і тому вони більше не містяться на класному шляху за замовчуванням у Java SE 9. У Java 11 вони повністю видаляються з JDK.

Java 9 представляє поняття модулів, і за замовчуванням java.seагрегатний модуль доступний на classpath (а точніше, модуль-шлях). Як випливає з назви, java.seмодуль агрегації не включає API Java EE, які традиційно постачаються з Java 6/7/8.

На щастя, ці API Java EE, які були надані в JDK 6/7/8, все ще знаходяться в JDK, але вони просто не знаходяться на класному шляху за замовчуванням. Додаткові API EE Java надаються в наступних модулях:

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

Швидке та брудне рішення: (лише JDK 9/10)

Щоб зробити API JAXB доступними під час виконання, вкажіть наступний варіант командного рядка:

--add-modules java.xml.bind

Але мені це все одно потрібно для роботи з Java 8 !!!

Якщо ви спробуєте вказати --add-modulesстаріший JDK, він підірветься, оскільки це нерозпізнаний варіант. Я пропоную один із двох варіантів:

  1. Ви можете встановити будь-які варіанти Java 9+ лише за допомогою JDK_JAVA_OPTIONSзмінної середовища. Назви змінних середовища автоматично зчитується з допомогою javaракети - носія для Java 9+.
  2. Ви можете додати те, -XX:+IgnoreUnrecognizedVMOptionsщоб змусити JVM мовчки ігнорувати нерозпізнані варіанти, а не підірвати. Але будьте обережні! Будь-які інші аргументи командного рядка, які ви використовуєте, більше не будуть затверджені для вас JVM. Ця опція працює як з Oracle / OpenJDK, так і з IBM JDK (станом на JDK 8sr4).

Альтернативне швидке рішення: (лише JDK 9/10)

Зверніть увагу, що ви можете зробити всі перераховані вище модулі Java EE доступними під час виконання, вказавши --add-modules java.se.eeпараметр. java.se.eeМодуль являє собою агрегат модуль , який включає в себе java.se.eeтак само , як зазначені вище модулі API Java EE. Зауважте, це не працює на Java 11, оскільки java.se.eeїї видалено в Java 11.


Правильне довгострокове рішення: (JDK 9 і вище)

Перелічені вище модулі API Java EE мають усі позначення, @Deprecated(forRemoval=true)оскільки вони призначені для видалення в Java 11 . Таким чином, --add-moduleпідхід більше не працюватиме в Java 11 нестандартно.

Що вам потрібно буде зробити в Java 11 і далі - це включити власну копію API Java EE на шляху classpath або модуля. Наприклад, ви можете додати API JAX-B як залежність від Maven:

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

Докладнішу інформацію про JAXB див. На сторінці впровадження довідника JAXB.

Щоб отримати детальну інформацію про модульність Java, див. JEP 261: Система модулів

Для розробника Gradle або Android Studio: (JDK 9 і вище)

Додайте до build.gradleфайлу такі залежності :

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
Отже, якщо модулі API Java EE позначені застарілими, чи означає це, що в Java 10 JAXB більше не буде доступним під час виконання в Java 10? Це здається кроком назад. Нам доведеться повернутися до практики до 6 включення JAXB як залежності.
Майкл

4
Використання --add-модулів java.se.ee або --add-модулів ALL-SYSTEM як вирішення не рекомендується відповідно до посібника з міграції тут docs.oracle.com/javase/9/migrate у розділі Модулі, що діляться з Java EE Не Вирішено за замовчуванням -> пункт 1
justMe

6
З офіційним випуском Java 10 ми можемо підтвердити, що метод додавання модулів все ще буде працювати. В javax.xml.bindі інших класах JavaEE заплановані для видалення в Java 11, в СЕП-320 .
Joep Weijers

10
А тепер виходить Java 11 і java.se.eeмодуль видалено, тому --add-modulesрішення більше не працює. Замість цього скористайтеся рекомендованим рішенням: додайте JAXB як окрему залежність.
Джеспер

11
я додав ці залежності, і він все ще дає мені ту саму помилку. будь-які ідеї чому?
Жоао Віейра

262

У моєму випадку (весняна баночка жиру для завантаження) я просто додаю наступне до pom.xml.

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

10
Просто для довідки github.com/spring-projects/spring-boot/wiki / ...
Tuno

9
Додавання такої залежності від градусів testCompile('javax.xml.bind:jaxb-api')працювало на мене.
pamcevoy

5
Як і згадував @pamcevoy, не потрібно вказувати версію jaxb-api при використанні Spring Boot. Запуск завантажує версію автоматично.
Марсель Овердійк

2
Я пропоную використати <scope>runtime</scope>для такого випадку
ВладС

5
@ Посилання на Tuno
Франциско Матео

69

Жодне з цих рішень не працювало для мене добре в останній JDK 9.0.1.

Я виявив, що цього списку залежностей достатньо для належного функціонування, тому вам не потрібно чітко вказувати --add-module(хоча він вказаний в межах пам’яті цих залежностей). Єдине, що вам потрібно, це вказати цей перелік залежностей:

<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
Для JDK 8 видаліть jaxb-core та jaxb-impl зверху.
foo

3
@Anil - це pom.xmlфайл конфігурації Maven. Якщо ви не знаєте, що це таке, то краще почати з
жебрацтва

8
Виникла незаконна операція відображення доступу ПОПЕРЕДЖЕННЯ: Незаконне відбиваючий доступ від com.sun.xml.bind.v2.runtime.reflect.opt.Injector (файл: / C: /Users/eis/.m2/repository/com/sun/ xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar) для методу java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int) УВАГА: Будь ласка, врахуйте повідомляючи про це технічним обслуговувачам com.sun.xml.bind.v2.runtime.reflect.opt.Injector ПОПЕРЕДЖЕННЯ: Використовуйте --illegal-access = попереджайте, щоб увімкнути попередження щодо подальших незаконних операцій з відображенням доступу ПОПЕРЕДЖЕННЯ: Усі незаконні операції доступу будуть відмовлено у майбутньому випуску
Стефан

1
Це працювало для мене на JDK 9.0.4 (я викликав код, пов'язаний з JAXB, через плагін Maven з Maven 3.5.3). Хоча я б використовував <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>як останню залежність.
scrutari

1
Дивовижно. У мене виникла ситуація, коли - чомусь - додаток для весняного завантаження запускатиметься в Intellij CE, але не затемнення на mac, а в eclipse, але не intellij CE на win10. Працювати в одному IDE на двох платформах - це перевага.
kometen

42

Це працювало для мене:

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

Оновлення

Як @Jasper запропонував, щоб уникнути залежності від усієї бібліотеки EclipseLink, ви також можете просто залежати від EclipseLink MOXy:

Мейвен

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

Градле

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

Як залежність від мого додатку Java 8, який виробляє * .jar, який може працювати як JRE 8, так і JRE 9 без додаткових аргументів.

Крім того, це потрібно виконати десь до того, як буде використаний API JAXB:

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

Поки працює чудово, як вирішення проблеми. Не схоже на ідеальне рішення, хоча ...


5
додавання org.eclipse.persistence:eclipselinkлише для отримання API JAXB - це дуже вагома залежність, якщо ви вже не використовуєте eclipselink?
Енді Гіберт

4
Так, він важкий (~ 9mb), і так, я вже використовував це. Я вже згадував, що це просто альтернативне рішення для тих, кому, можливо, тимчасовим, доведеться використовувати як 8, так і 9 JRE для однієї jar / war без надання аргументів командного рядка.
Михайло Холодков

2
задля взаємодії між JDK 8 та 9, я рекомендував би скористатися параметром -XX:+IgnoreUnrecognizedVMOptionsкомандного рядка (оновив свою відповідь з деталями)
Енді Гіберт

System.setProperty ("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); не працює для мене
Девід Броссар

1
Щоб уникнути залежності від усієї бібліотеки EclipseLink, ви також можете просто залежати від EclipseLink MOXy: groupId org.eclipse.persistence, artifactId org.eclipse.persistence.moxy.
Джеспер

36

чистий розчин для всіх JDK> = 9

Вам потрібно додати дві залежності до своєї збірки

  • jaxb-api
  • реалізація jaxb

Як реалізацію я вирішив використовувати посилання на реалізацію Glassfish, щоб позбутися від старих класів / бібліотек com.sun. Отже, як результат, я додав у своєму складі 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>

Зауважте, що з версії 2.3.1 вам більше не потрібно додавати javax.activation. (див. https://github.com/eclipse-ee4j/jaxb-ri/isissue/1222 )


Чи дійсно потрібен модуль javax.xml.bind? Мій код у JDK 11 працює без нього.
k.liakos

@ k.liakos Я не впевнений. Jar-ruxime jar і api-jar не діляться однаковими класами / пакетами. Я думаю, це залежить від вашого коду. Якщо ваш код не використовує класи з пакету 'javax.xml.bind', вам, мабуть, це не потрібно. Тема цієї теми полягає в тому, що "javax / xml / bind / JAXBException" не можна знайти; цей клас є лише у jaxb-api.
Себастьян Тесей

1
Чудово працює з мультимодульним проектом у java 12.
Heril Muratovic

35

Це тому, що версія java, якщо ви використовуєте jdk 9 або більш пізню версію, просто додайте це до своєї пом

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

1
Я постійно натрапляю на це разом з путівниками весняного завантаження ... Дякую тонну.
masterxilo

2
@ Cesar Rodriguez T, я спробував це на прикладі шахрайства і компіляція працювала, але запуск давав помилки. Я використав вибрану відповідь, яка включала більше залежностей, і це спрацювало.
PatS

У файлі pom.xml вашого проекту
Сезар Родрігес T

22

Щоб вирішити це, я імпортував у свій проект кілька файлів JAR:

  • 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. Завантажте файли вище та скопіюйте їх у папку libs у проекті
  2. Додайте імпортовані файли JAR у Java Build Path

4
Зауважте, що com.sun.xml.bindартефакти давні та надаються лише для зворотної сумісності. Ви повинні використовувати org.glassfish.jaxbзамість цього еквівалентні артефакти, як зазначено в деяких інших відповідях.
Джеспер

Це не спрацювало для мене. Він кинув помилку і сказав, що не може знайти конкретний клас.
RamenChef

Під час розгортання програми Grails 3.4.10 я працював у папці tomcat9 / lib під монетним двором 19.2 (база Ubuntu 18.04).
Mohamad

18

Під час компіляції, а також час запуску додайте перемикач --add-modules java.xml.bind

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

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

Гарне введення JDK 9модулів можна також знайти на веб- сайті: https://www.youtube.com/watch?v=KZfbRuvv5qc


11

Це працювало для мене. Додавання лише jaxb-api було недостатньо.

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

А для чого було встановлено jaxb-api.version?
МігельМуноз

@MiguelMunoz Я використав 2.2.7
містер Джедай

2
Зауважте, що com.sun.xml.bindартефакти давні та надаються лише для зворотної сумісності. Ви повинні використовувати org.glassfish.jaxbзамість цього еквівалентні артефакти, як зазначено в деяких інших відповідях.
Jesper

11

Перейдіть на свій Build.gradle і додайте нижче залежності як для Java 9, так і для 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'

11

Ви можете використовувати --add-modules=java.xml.bindопцію JVM, щоб додати модуль прив'язки xml до середовища виконання JVM.

Наприклад: java --add-modules=java.xml.bind XmlTestClass


11

Оновлення квітня 2019 року

Changelong для випусків JAXB знаходиться на веб-сторінці https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html

витяги:

    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

Авторитетне посилання знаходиться на https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

Maven координати для артефактів JAXB

jakarta.xml.bind: jakarta.xml.bind-api: API-класи для JAXB. Необхідний для компіляції проти JAXB.

org.glassfish.jaxb: jaxb-runtime: реалізація JAXB, час виконання, що використовується для серіалізації та десеріалізації об'єктів Java до / від xml.

Пачки жирових банок JAXB:

com.sun.xml.bind: jaxb-impl: JAXB час роботи жиру банку.

На відміну від артефактів org.glassfish.jaxb, ці банки мають усі класи залежності. Ці артефакти не містять дескрипторів модулів JPMS. У проектах Maven замість цього слід використовувати артефакти org.glassfish.jaxb.

org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 працює:

[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

Оригінальний відповідь

Слідом за тим, які артефакти я повинен використовувати для JAXB RI у своєму проекті Maven? в Maven ви можете використовувати такий профіль, як:

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

Дерево залежності показує:

[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

Щоб використовувати це в Eclipse, скажімо, Oxygen.3a Release (4.7.3a) або пізнішої версії, Ctrl-Alt-P або клацніть правою кнопкою миші на проекті Maven, а потім виберіть профіль.


Дякуємо, що показали, що залежність від javax.xml.bind>, jaxb-apiяку я бачив в іншому місці, насправді зайва. Залежність скляної рибки тягне її. Я просто спробував це, і це справді працює.
Василь Бурк

8

Для виконання веб-запуску Java ми можемо використовувати пропозицію Енді Гіберта таким чином:

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

Зверніть увагу на додаткові "=" в --add-модулях. Дивіться цей квиток OpenJDK або останню примітку в розділі "Розуміння попереджень про доступ до виконання" на платформі Java, Стандартне посібник з міграції Oracle JDK 9 Standard Edition .


8

додати javax.xml.bind залежність у pom.xml

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

8

Оскільки JavaEE тепер керується https://jakarta.ee/ , нові координати Maven станом на 2.3.2:

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

Перша випущена jaxb.version - 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

Я дотримувався цієї URL-адреси, і наведені нижче налаштування дійсно допомогли мені. Я використовую Java 10 з STS IDE в Macbook Pro. Це працює як шарм.

   <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

Це вирішило мої проблеми із залежностями під керуванням Apache Camel 2.24.1 на Java 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>

у моєму випадку мені потрібно додати залежність від Tomcat у файлі pom
GvSharma

6

Я зіткнувся з тією ж проблемою, використовуючи Spring Boot 2.0.5.RELEASEна Java 11.

Додавання javax.xml.bind:jaxb-api:2.3.0поодинці не вирішило проблему. Я також повинен був оновити Spring Boot до останнього етапу 2.1.0.M2, тому я припускаю, що це буде виправлено у наступному офіційному випуску.


Це не звучить для мене. У цій темі є кілька рішень, які працюють незалежно від використання весняного завантаження 2. (Я також використовую весняний завантажувач 2.0.5.RELEASE btw). Можливо, навесні 2.1.0.M2 вже включено час виконання jaxb.
Себастьян Тесей

Здається, що з Spring Boot 2.1.0.RELEASE більше не потрібен JAXB - github.com/spring-projects/spring-boot/releases
Burrich

5

Вам потрібно додати залежності JAX-B при використанні JDK 9+. Для користувачів Android студії, вам потрібно додати до вашого build.gradle«сек dependencies {}блоку:

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

Чи не працює для модульних тестів , хоча
Malachiasz

Я змінив вашу відповідь, щоб також працювати з модульними тестами.
Малахіаш

4

Я також натрапив на ClassNotFoundException: javax.xml.bind.DatatypeConverter за допомогою Java 11 і

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

Я спробував все це навколо додавання javax.xml.bind: jaxb-api або весняного завантаження jakarta.xml.bind-api .. Я знайшов підказку на виправлення у jjwt версії 0.10.0 .. але найголовніше, що пакет jjwt - це тепер розколоться!

Таким чином, перевірте це посилання: https://github.com/jwtk/jjwt/isissue/510

Просто, якщо ви використовуєте

Java11 та jjwt 0.9.x, і ви стикаєтеся з проблемою ClassNotFoundException: javax.xml.bind.DatatypeConverter,

піти на

jjwt версія 0.11.x, але використовуйте розділені пакети: https://github.com/jwtk/jjwt#install

Ви не знайдете більш високу версію для jjwt залежності, оскільки вони розділили пакети.

Ура.


3

Не відповідь, а додаток: я отримав тому, що запуск groovysh(Groovy 2.4.13), якщо JAVA_HOME вказує на установку Java 9 ( java version "9.0.1"якщо бути точним), виявляється невдалим:

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

Рішення полягало в тому, щоб:

  • Перейдіть до проекту JAXB на веб-сайті github.io ( "JAXB ліцензований за подвійною ліцензією - CDDL 1.1 та GPL 2.0 з винятком Class-path" )

  • Завантажити jaxb-ri-2.3.0.zip

  • Відкрийте папку, куди не поміщаєте файли інфраструктури Java (у моєму випадку, /usr/local/java/jaxb-ri/ ). Можливо, існує інше рішення (можливо, через SDKMAN, я не знаю)

  • Переконайтесь, що банки в підкаталозі lib знаходяться на CLASSPATH. Я роблю це через скрипт, запущений при запуску bash, званий /etc/profile.d/java.sh, де я додав (серед багатьох інших рядків) наступний цикл:

Упакований у функцію ...

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

І це працює!


1
Я не розумію потоків. Мабуть, люди хочуть розмовляти з командним рядком, а не отримувати банки? Підходить собі.
Девід Тонхофер

7
Розробники Java зазвичай використовують засоби збирання, такі як Gradle або Maven, для управління залежностями, а не завантажують банки вручну. Мабуть, це і є причиною зниження голосів.
Джошуа Девіс


2

Гаразд, у мене виникли такі ж проблеми, але я використовував Java 8 і продовжував отримувати цю помилку, я спробував більшість рішень. але виявляється, що мій мавен все ще вказував на java 9, хоча я встановив глобальну версію Java на 8, як тільки я встановив, що все працює.

Для всіх, у кого можуть виникнути подібні проблеми, ознайомтеся з тим, як виправити Maven для використання Java за замовчуванням


2

Стара відповідь "Проблема вирішена шляхом переходу на amazoncorretto" Відповідь новин: Я використовував останнє corretto, але схожий jdk 1.8. тому в будь-якому випадку нам потрібно додавати залежності вручну


2
Розподіл Amazon Corretto для JDK 11 не забезпечує класи javax.xml.bind. Якщо проблему було вирішено після переходу на Correto, це було тому, що ви перейшли на JDK 8.
Andy Guibert

дивно, я перевірю, у докері я використав останню коректорію
Армен Арзуманян

Так, amazoncorretto:latestзараз JDK 8 дає, а не 11. Багато зображень Docker все ще базуються на JDK 8, саме через проблеми сумісності, викликані видаленням API між JDK 8 -> 11
Andy Guibert

2

Версії залежності, які мені потрібно було використовувати при компілюванні для Java 8 target. Випробуваний додаток у Java JRE 8, 11 та 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 -->

2

Для мене в Java 11 і gradle ось що:

plugins {
      id 'java'
}

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

куди саме ми це ставимо?
nyxee

У файлі build.gradle, якщо ви використовуєте gradle.
silver_mx

1

Вам потрібно додати jaxb залежності до Maven. Версія 2.3.2 для реалізації скловолокна ідеально сумісна з новою 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>

1

У мене були подібні проблеми після оновлення мого проекту до java 11, то те, що виправлено, було оновлення до весняного завантаження 2.1.1, яке, мабуть, має підтримку Java 11, це допомогло


будь ласка, подумайте про те, щоб додати у відповідь хоча б частину рішення, оскільки відповіді, що стосуються лише посилань, стануть недійсними, якщо URL-адреса зміниться в майбутньому.
юкасима хуксай

0

Я знаю, що я спізнююся на вечірку, але моя помилка виявилася потрібною різним рішенням ... і дуже просто

Я спочатку перейшов на Tomcat 9 і зрозумів, що мені потрібно 7 ... Я забув відобразити шлях свого класу назад до версії 7 у build.xml

Сподіваємось, це допоможе виправити помилку в майбутньому, кому вдається не помітити цю просту проблему, як я!


2
Хоча це може допомогти ОП, краще додати більше деталей, прикладів тощо
Tiw

0

Якщо ви викликаєте веб-сервіси SOAP (наприклад, використовуєте jaxws-maven-plugin), просто додавши цю залежність, всі помилки JAXB зникають:

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

Тестовано на Java 13

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.