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

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

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

Комментарии к вопросу (5)
Решение

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

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

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


java.activation
java.corba
java.transaction
java.xml.bind  
Комментарии (28)

В моем случае (весна загрузки жиров банку), я просто добавить следующую строку в pom.xml.


    javax.xml.bind
    jaxb-api
    2.3.1
Комментарии (7)

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

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



        javax.xml.bind
        jaxb-api
        2.3.0


        com.sun.xml.bind
        jaxb-impl
        2.3.0


        org.glassfish.jaxb
        jaxb-runtime
        2.3.0


        javax.activation
        activation
        1.1.1

Комментарии (11)

Это сработало для меня:


    javax.xml.bind
    jaxb-api
    2.3.0


    org.eclipse.persistence
    eclipselink
    2.7.0

Обновить

Как предложил @Jasper, чтобы не зависеть от всей библиотеки EclipseLink, вы также можете просто зависеть от EclipseLink MOXy:

Maven.


    org.eclipse.persistence
    org.eclipse.persistence.moxy
    2.7.3

Градл

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");

Пока что работает отлично, как обходной путь. Однако не похоже, что это идеальное решение...

Комментарии (8)

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


  javax.xml.bind
  jaxb-api
  2.3.0
Комментарии (4)

чистое решение для всех пакетов JDK >= 9

Нужно добавить две зависимости для сборки

  • в случае JAXB-АФИ
  • реализация JAXB

В качестве реализации я решил использовать эталонную реализацию на GlassFish для избавиться от старых ком.солнце классов / библиотек. Так что в результате я добавил в мой сборка


  javax.xml.bind
  jaxb-api
  2.3.1



  org.glassfish.jaxb
  jaxb-runtime
  2.3.1

Обратите внимание, что начиная с версии 2.3.1 вас Дон'т нужно добавить класс javax.активации больше. (см. https://github.com/eclipse-ee4j/jaxb-ri/issues/1222)

Комментарии (3)

Во время компиляции, а также во время выполнения добавьте переключатель add-modules java.xml.bind.

javac --add-modules java.xml.bind 

java --add-modules java.xml.bind 

Хорошее введение в модули JDK 9 можно также найти на сайте : https://www.youtube.com/watch?v=KZfbRuvv5qc

Комментарии (0)

Чтобы решить эту проблему, я импортировал некоторые файлы 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. Скачать файлы и скопировать их в папку библиотеки в проект
  2. Добавить импортированные файлы Jar в Java путь сборки
Комментарии (2)

Вы можете использовать `--добавление модулей=Ява.в формате XML.опцию JVM привязать, чтобы добавить модуль XML привязки к JVM во время выполнения окружающей среды.

Например: Ява-добавить-модулей=Ява.в формате XML.связать XmlTestClass

Комментарии (0)

Обновление За Апрель 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

Мэйвен координаты для JAXB артефакты

В Джакарта.в формате XML.персонализация:Джакарта.в формате XML.привязать к API: АРІ-классы для JAXB. Требуется для сборки на JAXB.

орг.в GlassFish.на JAXB:в JAXB-среда: реализация JAXB, за выполнения для сериализации и десериализации объектов Java в/из XML.

на JAXB жир-банку связки:

У ком.солнце.в формате XML.персонализация:в JAXB-осущ: среда выполнения на JAXB жира В банке.

В отличие от В орг.в GlassFish.артефактов JAXB, эти банки имеют все зависимости классы вошли внутрь. Эти артефакты не содержит модуля совместной программы по методологии обследований описатели. В проектах Maven орг.в GlassFish.артефакты JAXB в должен использоваться вместо этого.

орг.в GlassFish.на JAXB:в JAXB-время:опарник: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

Оригинальный Ответ

Следующим https://stackoverflow.com/questions/26413431/which-artifacts-should-i-use-for-jaxb-ri-in-my-maven-project в Maven, вы можете использовать профиль, как:


    java-9

        9



            org.glassfish.jaxb
            jaxb-runtime
            2.3.0


            javax.activation
            activation
            1.1.1


Зависимость показывает дерево:

[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, скажем кислорода.Выпуск 3а (4.7.3) или позже, контрол-Альт-П, или щелкните правой кнопкой мыши на проекте Maven, а затем выберите профиль.

Комментарии (1)

Этот работал для меня. Добавление только в JAXB-АПИ было'т достаточно.


            javax.xml.bind
            jaxb-api
            ${jaxb-api.version}


            com.sun.xml.bind
            jaxb-impl
            ${jaxb-api.version}


            com.sun.xml.bind
            jaxb-core
            ${jaxb-api.version}
Комментарии (3)

Идут в сборку.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'
Комментарии (0)

добавить к javax.в формате XML.зависимость связывания в pom.xml


        javax.xml.bind
        jaxb-api
        2.3.0
Комментарии (0)

Для Java веб-запуск выполнения можно использовать Энди Гибер's, как это предложение:

Обратите внимание на дополнительные, что "=" В-добавить-модулей. Вижу его теперь билет]1 или последняя нота в "понимание выполнения предупреждения доступ к" из платформы Java, стандартной редакции СУБД Oracle версии JDK 9 руководство по миграции.

Комментарии (0)

Я столкнулся с такой же проблемой с использованием Spring загрузки 2.0.5.Релиз на Java 11.

Добавление класса javax.в формате XML.персонализация:в JAXB-АФИ:2.3.0 в одиночку не решить проблему. Мне тоже пришлось обновить весенний ботинок на последний рубеж 2.1.0.М2, поэтому я предполагаю, что это будет исправлено в следующем официальном релизе.

Комментарии (2)

Я следовал этому URL и настройки внизу действительно помогло мне. Я использую Java 10 с СТС IDE в МасВоок Pro. Он работает как шарм.


    javax.xml.bind
    jaxb-api
    2.3.0


    org.glassfish.jaxb
    jaxb-runtime
    2.3.0
    runtime


    javax.activation
    javax.activation-api
    1.2.0
Комментарии (0)

Это решило мои проблемы с зависимостями запуск Apache верблюда 2.24.1 на Яве 12:


        javax.activation
        activation
        1.1.1



        javax.xml.bind
        jaxb-api
        2.3.1



        com.sun.xml.bind
        jaxb-core
        2.3.0.1



        com.sun.xml.bind
        jaxb-impl
        2.3.0.1
Комментарии (1)

Не ответ, а дополнение: у меня ведь работает groovysh (Заводной 2.4.13) при переменной JAVA_HOME указывает на Ява 9 установка (Java-версии и"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.(Groovysh.groovy:135)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.(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.Ио ("в JAXB является лицензированной под двойной лицензией - 1.1 CDDL и GPL 2.0 с исключением и quot Путь к классу;)

  • Скачать jaxb-ri-2.3.0.zip`

  • Распаковать куда вы кладете файлы Java инфраструктуры (в моем случае, /usr/местные/Ява/в JAXB-Ри/). Другие решения могут существовать (возможно через SDKMAN, я Незнайка)

  • Убедитесь, что банки в подкаталоге lib на классов. Я делаю это через скрипт стартовал при запуске Баш, под названием /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

И это работает!

Комментарии (2)

Поскольку в JavaEE теперь регулируется https://jakarta.ee/ новый Мэйвен координаты пункта 2.3.2 являются:

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

Впервые выпущен в JAXB.версия 2.3.2.


  2.3.2



  jakarta.xml.bind
  jakarta.xml.bind-api
  ${jaxb.version}


    org.glassfish.jaxb
    jaxb-runtime
    ${jaxb.version}
Комментарии (0)

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

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

Комментарии (0)