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

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

Ответы (39)

The JAXB APIs are considered to be Java EE APIs and therefore are no longer contained on the default classpath in Java SE 9. In Java 11, they are completely removed from the JDK.

Java 9 introduces the concepts of modules, and by default, the java.se aggregate module is available on the classpath (or rather, module-path). As the name implies, the java.se aggregate module does not include the Java EE APIs that have been traditionally bundled with Java 6/7/8.

Fortunately, these Java EE APIs that were provided in JDK 6/7/8 are still in the JDK, but they just aren't on the classpath by default. The extra Java EE APIs are provided in the following modules:

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

Quick and dirty solution: (JDK 9/10 only)

To make the JAXB APIs available at runtime, specify the following command-line option:

--add-modules java.xml.bind

But I still need this to work with Java 8!!!

If you try specifying --add-modules with an older JDK, it will blow up because it's an unrecognized option. I suggest one of two options:

  1. You can set any Java 9+ only options using the JDK_JAVA_OPTIONS environment variable. This environment variable is automatically read by the java launcher for Java 9+.
  2. You can add the -XX:+IgnoreUnrecognizedVMOptions to make the JVM silently ignore unrecognized options, instead of blowing up. But beware! Any other command-line arguments you use will no longer be validated for you by the JVM. This option works with Oracle/OpenJDK as well as IBM JDK (as of JDK 8sr4).

Alternate quick solution: (JDK 9/10 only)

Note that you can make all of the above Java EE modules available at run time by specifying the --add-modules java.se.ee option. The java.se.ee module is an aggregate module that includes java.se.ee as well as the above Java EE API modules. Note, this doesn't work on Java 11 because java.se.ee was removed in Java 11.


Proper long-term solution: (JDK 9 and beyond)

The Java EE API modules listed above are all marked @Deprecated(forRemoval=true) because they are scheduled for removal in Java 11. So the --add-module approach will no longer work in Java 11 out-of-the-box.

What you will need to do in Java 11 and forward is include your own copy of the Java EE APIs on the classpath or module path. For example, you can add the JAX-B APIs as a Maven dependency like this:



    jakarta.xml.bind
    jakarta.xml.bind-api
    2.3.2




    org.glassfish.jaxb
    jaxb-runtime
    2.3.2

See the JAXB Reference Implementation page for more details on JAXB.

For full details on Java modularity, see JEP 261: Module System

For Gradle or Android Studio developer: (JDK 9 and beyond)

Add the following dependencies to your build.gradle file:

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

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

Например: java --add-modules = java.xml.bind XmlTestClass

In my case (spring boot fat jar) I just add the following to pom.xml.


    javax.xml.bind
    jaxb-api
    2.3.1

Чтобы решить эту проблему, я импортировал в свой проект несколько файлов JAR:

  • javax.activation-1.2.0.jar

http://search.maven.org/remotecontent?filepath=com/ sun / activate / 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

Обновление за апрель 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-артефакты

Координаты 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 вы можете использовать такой профиль, как:


    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, скажем, Oxygen.3a Release (4.7.3a) или новее, Ctrl-Alt-P или щелкните правой кнопкой мыши проект Maven, затем выберите профиль.

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

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

добавить зависимость javax.xml.bind в pom.xml

    
        javax.xml.bind
        jaxb-api
        2.3.0
    

Чистое решение для всех JDK> = 9

Вам нужно добавить две зависимости в вашу сборку

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

В качестве реализации я решил использовать эталонную реализацию от glassfish, чтобы избавиться от старых классов / библиотек com.sun. Итак, в результате я добавил в свою сборку maven


  javax.xml.bind
  jaxb-api
  2.3.1



  org.glassfish.jaxb
  jaxb-runtime
  2.3.1

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

Это сработало для меня, у меня есть проект весенней загрузки, который компилируется на Java 8, но я не знаю, почему однажды мой maven начал компилировать с Java 11, в Ubuntu я исправлял это:

sudo update-java-alternatives  -l

Это показало мне доступный JDK на моем компьютере:

java-1.11.0-openjdk-amd64      1111       /usr/lib/jvm/java-1.11.0-openjdk-amd64
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64`

Итак, я, наконец, запускаю эту команду, чтобы выбрать желаемый:

sudo update-java-alternatives  -s java-1.8.0-openjdk-amd64 

И все, подробнее см. Как использовать альтернативные варианты обновления команды

Для меня в Java 11 и gradle вот что сработало:

plugins {
      id 'java'
}

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

Это решило мои проблемы с зависимостями, работающими под управлением Apache Camel 2.24.1 на Java 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
    

Если вы вызываете веб-службы SOAP (например, используя jaxws-maven-plugin), просто добавляя эту зависимость, все ошибки JAXB исчезают:


            org.glassfish.metro
            webservices-rt
            2.4.3

Протестировано с Java 13

Решение для SBT

libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.1"

You only need 1 dependency:

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

Я также наткнулся на ClassNotFoundException: javax.xml.bind.DatatypeConverter, используя Java 11 и


    io.jsonwebtoken
    jjwt
    0.9.1

Я пробовал все это, добавляя javax.xml.bind: jaxb-api или spring boot 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

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

Ура.

Я столкнулся с этой проблемой при работе над Java Project в Debian 10.

Каждый раз, когда я запускаю приложение, оно выдает ошибку в лог-файле:

java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException

Вот как я это решил:

Проблема часто возникает, когда библиотека JAXB (архитектура Java для привязки XML) отсутствует в пути к классам. JAXB включен в Java SE 10 или более ранней версии, но удален из Java SE из Java 11 или новее - перемещен в Java EE в рамках проекта Jakarta EE.

Итак, я проверил свою версию Java, используя:

java --version

И это дало мне этот результат

openjdk 11.0.8 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+10-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Debian-1deb10u1, mixed mode, sharing)

Итак, я столкнулся с ошибкой JAXBException, потому что я использовал Java 11, у которого нет библиотеки JAXB (архитектура Java для привязки XML) отсутствует в пути к классам. В него включен JAXB.

Чтобы решить эту проблему, мне пришлось добавить библиотеку JAXB API в lib (/ opt / tomcat / lib) каталог моей установки tomcat:

sudo wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar

Затем я переименовал его из jaxb-api-2.4.0-b180830.0359.jar в jaxb-api.jar:

sudo mv jaxb-api-2.4.0-b180830.0359.jar jaxb-api.jar

Примечание: убедитесь, что вы изменили разрешение, разрешающее tomcat доступ к файлу, а также изменили право собственности на tomcat:

sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod -R 777 /opt/tomcat/

И затем я перезапустил сервер tomcat:

sudo systemctl restart tomcat

Ресурсы: [Решено] java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException

Вот и все.

Надеюсь, это поможет

Для меня это простое решение (пользователь Mac)

 запустить в терминале -> псевдоним j8 = "export JAVA_HOME =` / usr / libexec / java_home -v 1.8`; java -version "

затем запустите -> j8

вот оно !! (теперь запустите свои команды mvn)

Или вы можете указать выше в своем .bash_profile

у меня были аналогичные проблемы после обновления моего проекта до java 11, а затем исправлено обновление до весенней загрузки 2.1.1, которая, по-видимому, поддерживает java 11, это помогло

Это сработало для меня. Недостаточно добавить только jaxb-api.

        
            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}
        

Вам нужно добавить jaxb-зависимости в maven. Реализация glassfish версии 2.3.2 полностью совместима с новой версией jakarta EE jaxb api версии 2.3.2.



    jakarta.xml.bind
    jakarta.xml.bind-api
    2.3.2




    org.glassfish.jaxb
    jaxb-runtime
    2.3.2

Добавление приведенной ниже зависимости сработало для меня.

        
    
        jakarta.xml.bind
        jakarta.xml.bind-api
        2.3.2
    

    
    
        org.glassfish.jaxb
        jaxb-runtime
        2.3.2
    

это потому, что версия java, если вы используете jdk 9 или более позднюю версию, просто добавьте это в свой pom


  javax.xml.bind
  jaxb-api
  2.3.0

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

        
        
            javax.xml.bind
            jaxb-api
            2.2.8
        
        
            com.sun.xml.bind
            jaxb-core
            2.2.8-b01
        
        
            com.sun.xml.bind
            jaxb-impl
            2.2.8-b01
        
        

Перейдите в свой 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'

Я перешел по этому URL-адресу, и приведенные ниже настройки мне очень помогли. Я использую Java 10 с STS IDE в Macbook 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

Я хочу дать простое и легкое решение по поводу этого исключения, просто понизьте версию android studio до версии 4.1.1 или ниже. Убедитесь, что у вас нет android studio arctic fox (2020.3.1) версии, потому что последняя версия не поддерживает старый проект android.

Вам необходимо добавить зависимости JAX-B при использовании JDK 9+. Для пользователя Android Studio вам необходимо добавить это в свои build.gradledependencies {} block:

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

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

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

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

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

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

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


    
        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
    

Во время компиляции, а также во время выполнения добавьте переключатель - 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

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

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

Для Java Web Start Execution мы можем использовать предложение Энди Гиберта следующим образом:


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

Основная причина этой проблемы заключается в том, что Gradle Daemon использует JDK11, либо вы устанавливаете JAVA_HOME на JDK11, либо выполняете задачу Gradle в общем демоне, который работает с JDK11.

Для Android:

  1. Проверьте настройки структуры проекта, вы можете изменить JDK на JDK8 оттуда.

  2. Вы также можете установить JAVA_HOME и указать на java8 home.

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

Изначально я перешел на Tomcat 9 и понял, что мне нужно 7 ... Я забыл сопоставить мой путь к классу с версией 7 в build.xml

Надеюсь, это исправит ошибку кого-то elses в будущем, которому удастся не заметить эту простую проблему, как это сделал я!

Поскольку JavaEE теперь регулируется https://jakarta.ee/, новые координаты Maven начиная с 2.3.2:

https://eclipse-ee4j.github.io/jaxb-ri/#maven-артефакты

Первая выпущенная версия jaxb. - 2.3.2.


  2.3.2



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


    org.glassfish.jaxb
    jaxb-runtime
    ${jaxb.version}

Я столкнулся с той же проблемой в приложении, в котором на уровне модуля build.gradle добавлены как привязка представления, так и привязка данных.

Ранее

viewBinding {
    enabled = true
}

dataBinding {
    enabled = true
}

Решено

dataBinding {
    enabled = true
}

На уровне проекта build.gradle используется как показано ниже

classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"

Не ответ, а дополнение: я получил, потому что запущен groovysh (Groovy 2.4.13), если JAVA_HOME указывает на установку Java 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 Project на github.io («JAXB лицензируется по двойной лицензии - CDDL 1.1 и GPL 2.0 с исключением пути к классам»)

  • Скачать 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

И работает!

Как указано в официальной документации :

При обновлении вы можете столкнуться со следующим:

java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException

Hibernate обычно требует JAXB, который больше не предоставляется по умолчанию. Ты сможешь добавьте модуль java.xml.bind, чтобы восстановить эту функциональность с помощью Java9 или Java10 (даже если модуль устарел).

Начиная с Java11, модуль недоступен, поэтому единственный вариант - добавьте JAXB RI (вы можете сделать это с Java9 вместо добавления Модуль java.xml.bind:


Maven


    org.glassfish.jaxb
    jaxb-runtime

Gradle (build.gradle.kts):

implementation("org.glassfish.jaxb:jaxb-runtime")

Gradle (build.gradle)

implementation 'org.glassfish.jaxb:jaxb-runtime'

Если вы предпочитаете указывать конкретную версию, посмотрите здесь: https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime

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


    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

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

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

2022 WebDevInsider