Как решить java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException в Java 9


845

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

Классы JAXB были предоставлены как часть JDK начиная с Java 6, так почему же Java 9 больше не может найти эти классы?


2
Дополнительная часть в этом ответе связана с миграцией этих API.
Наман

7
сборка с Java 8 заставит ваш код скомпилировать yes, но когда вы попытаетесь запустить этот скомпилированный код на Java 9+, он потерпит неудачу, потому что JAX-B отсутствует.
Энди Гиберт

1
Для Java 11 решение этой статьи актуально: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Эрик Ван

Ответы:


1225

API-интерфейсы JAXB считаются API-интерфейсами Java EE и поэтому больше не содержатся в пути к классам по умолчанию в Java SE 9. В Java 11 они полностью удалены из JDK.

Java 9 вводит понятия модулей, и по умолчанию java.seагрегатный модуль доступен на пути к классам (точнее, на пути к модулям ). Как следует из названия, java.seагрегатный модуль не включает API-интерфейсы Java EE, которые традиционно поставлялись в комплекте с Java 6/7/8.

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

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)

Чтобы сделать JAXB API доступными во время выполнения, укажите следующую опцию командной строки:

--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 в путь к классам или в пути к модулям. Например, вы можете добавить 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
Таким образом, если модули Java EE API помечены как устаревшие, означает ли это, что в Java 10 JAXB больше не будет доступен во время выполнения в Java 10? Это похоже на шаг назад. Придется вернуться к практике до-6, включив JAXB в качестве зависимости.
Майкл

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

6
С официально выпущенной Java 10 мы можем подтвердить, что метод add-modules все еще будет работать. Эти javax.xml.bindи другие классы JavaEE планируется удалить в Java 11 в соответствии с JEP-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
Добавление зависимости gradle, как это testCompile('javax.xml.bind:jaxb-api')работает для меня.
Памчевой

5
Как упомянуто @pamcevoy, нет необходимости указывать версию jaxb-api при использовании Spring Boot. Boot управляет версией автоматически.
Марсель Овердийк,

2
Предлагаю использовать <scope>runtime</scope>для такого случая
VladS

5
@ Ссылка Туно у меня не сработала, фиксированная ссылка: github.com/spring-projects/spring-boot/wiki/…
Франциско Матео

69

Ни одно из этих решений не работало для меня хорошо в недавнем JDK 9.0.1.

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

<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. Если вы не знаете , что это такое, то лучше начать с beggining
Andremoniy

8
Произошла недопустимая операция рефлексивного доступа. ПРЕДУПРЕЖДЕНИЕ. Недопустимый рефлексивный доступ от com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file: / 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 = warn, чтобы включить предупреждения о дальнейших недопустимых операциях доступа с отражением. ПРЕДУПРЕЖДЕНИЕ. Все недопустимые операции доступа будут отказано в будущем выпуске
Stefan

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, но не в eclipse на mac, а в eclipse, но не в intellij CE на win10. Возможность работать в одной IDE на двух платформах является преимуществом.
Кометен

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>

Gradle

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

Как зависимости для моего приложения Java 8, которое создает * .jar, который может быть запущен как JRE 8, так и JRE 9 без дополнительных аргументов.

Кроме того, это нужно выполнить где-то перед использованием JAXB API:

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

Прекрасно работает до сих пор, как обходной путь. Не похоже на идеальное решение, хотя ...


5
добавление org.eclipse.persistence:eclipselinkтолько для получения JAXB API - очень тяжелая зависимость, разве вы уже используете eclipselink?
Энди Гиберт

4
Да, это тяжело (~ 9 МБ), и да, я уже использовал это. Я упомянул, что это просто альтернативный обходной путь для тех, кому, возможно, временно, придется использовать как 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.
Джеспер

37

чистое решение для всех 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/issues/1222 )


Действительно ли необходим модуль javax.xml.bind? Мой код в JDK 11 работает без него.
k.liakos

@ k.liakos Я не уверен. Jar-jaxb-runtime и api-jar не используют одни и те же классы / пакеты. Я думаю, это зависит от вашего кода. Если ваш код не использует классы из пакета 'javax.xml.bind', то, вероятно, вам это не нужно. Тема этой темы - «javax / xml / bind / JAXBException» не может быть найден; этот класс только в jaxb-api.
Себастьян Тис

1
Прекрасно работает с многомодульным проектом в java 12.
Херил Муратович

35

это потому, что Java-версия, если вы используете JDK 9 или более позднюю версию, просто добавьте это в свой POM

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

1
Я сталкиваюсь с этим все время с руководствами Spring Boot ... Спасибо огромное.
masterxilo

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

В файле pom.xml вашего проекта
Сезар Родригес Т

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-апи-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-ядро-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-осущ-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

Я работал, когда помещал их в папку tomcat9 / lib в Mint 19.2 (база Ubuntu 18.04) при развертывании приложения Grails 3.4.10.
Мохамад Факих

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

@MiguelMunoz Я использовал 2.2.7
Мистер Джедай

2
Обратите внимание, что com.sun.xml.bindартефакты старые и предоставляются только для обратной совместимости. org.glassfish.jaxbВместо этого вы должны использовать эквивалентные артефакты, как указано в некоторых других ответах.
Джеспер

11

Перейдите в Your 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, в этих jar-файлах есть все классы зависимостей. Эти артефакты не содержат дескрипторов модулей 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 Web Start Execution мы можем использовать предложение Энди Гиберта, как это:

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

Обратите внимание на дополнительные "=" в --add-modules. См. Этот билет OpenJDK или последнюю заметку в разделе «Общие сведения о предупреждениях доступа во время выполнения» платформы Java, Standard Edition Oracle JDK 9, Руководство по миграции .


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 до последней версии Milestone 2.1.0.M2, поэтому я предполагаю, что это будет исправлено в следующем официальном выпуске.


Это не похоже на меня. в этом потоке есть несколько решений, которые работают независимо от использования весенней загрузки 2. (я также использую весеннюю загрузку 2.0.5.RELEASE, кстати). Возможно, в Spring 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"
}

Не работает для модульных тестов, хотя
Малахия

Я изменил ваш ответ для работы с юнит-тестами.
Малахия

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/issues/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, я не знаю)

  • Убедитесь, что файлы jar в подкаталоге 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, чтобы управлять зависимостями, а не загружать файлы jar вручную. Это, вероятно, причина для отрицательных голосов.
Джошуа Дэвис


2

ОК, у меня возникла такая же проблема, но я использовал Java 8 и продолжал получать эту ошибку, я попробовал большинство решений. но оказывается, что мой maven все еще указывал на java 9, хотя я установил глобальную версию Java на 8, как только исправил, что все заработало.

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


2

Старый ответ «Проблема решена переключением на amazoncorretto». Ответ в новостях: Я использовал самую последнюю версию corretto, но похож на jdk 1.8. так что в любом случае нам нужно добавить зависимости вручную


2
Дистрибутив Amazon Corretto для JDK 11 не предоставляет классы javax.xml.bind. Если проблема была решена после перехода на Correto, то это потому, что вы понизились до JDK 8.
Энди Гиберт

странно, я проверю, в докере я использовал последнее сообщение
Армен Арзуманян

Да, в amazoncorretto:latestнастоящее время даёт JDK 8, а не 11. Многие образы Docker по-прежнему основаны на JDK 8, именно из-за проблем совместимости, вызванных удалением API между JDK 8 -> 11
Энди Гиберт

2

Версии зависимостей, которые мне нужно было использовать при компиляции для цели Java 8. Протестированное приложение в Java 8, 11 и 12 JRE.

        <!-- 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 для реализации Glassfish полностью совместима с новой версией 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
Хотя это может помочь OP, лучше добавить больше деталей, примеров и т. Д.
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.