1097

我有一些使用 JAXB API 类的代码,这些类在 Java 6/7/8 中作为 JDK 的一部分提供。当我使用 Java 9 运行相同的代码时,在运行时出现错误,表明找不到 JAXB 类。

JAXB 类自 Java 6 起就作为 JDK 的一部分提供,那么为什么 Java 9 不再能找到这些类呢?

4

40 回答 40

1594

JAXB API 被视为 Java EE API,因此不再包含在 Java SE 9 中的默认类路径中。在 Java 11 中,它们已从 JDK 中完全删除。

Java 9 引入了模块的概念,默认情况下,java.se聚合模块在类路径(或者更确切地说,模块路径)上可用。顾名思义,java.se聚合模块不包括传统上与 Java 6/7/8 捆绑的 Java EE API。

幸运的是,JDK 6/7/8 中提供的这些 Java EE API 仍然在 JDK 中,但它们只是默认不在类路径中。以下模块中提供了额外的 Java EE API:

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. JDK_JAVA_OPTIONS您可以使用环境变量设置任何仅限 Java 9+ 的选项。Java 9+的启动器会自动读取此环境变量。java
  2. 您可以添加-XX:+IgnoreUnrecognizedVMOptions以使 JVM 静默忽略无法识别的选项,而不是炸毁。但要小心!JVM 将不再为您验证您使用的任何其他命令行参数。此选项适用于 Oracle/OpenJDK 以及 IBM JDK(从 JDK 8sr4 开始)。

替代快速解决方案:(仅限 JDK 9/10)

请注意,您可以通过指定--add-modules java.se.ee选项使上述所有 Java EE 模块在运行时可用。该java.se.ee模块是一个聚合模块,包括java.se.ee以及上述 Java EE API 模块。请注意,这在 Java 11 上不起作用,因为java.se.ee在 Java 11 中已被删除。


适当的长期解决方案:(JDK 9 及更高版本)

上面列出的 Java EE API 模块都已标记@Deprecated(forRemoval=true),因为它们计划Java 11中删除。因此,该--add-module方法将不再适用于开箱即用的 Java 11。

在 Java 11 及更高版本中,您需要做的是在类路径或模块路径中包含您自己的 Java EE API 副本。例如,您可以将 JAX-B API 添加为 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"
}
于 2017-04-23T17:40:23.460 回答
344

就我而言(spring boot fat jar),我只需将以下内容添加到 pom.xml 中。

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
于 2017-11-21T12:07:57.377 回答
84

在最近的 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>
于 2018-01-07T12:06:12.493 回答
82

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

于 2018-10-18T10:37:57.883 回答
47

这对我有用:

<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 运行而无需额外的参数。

此外,这需要在使用 JAXB API 之前在某处执行:

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

到目前为止效果很好,作为一种解决方法。虽然看起来不是一个完美的解决方案......

于 2017-09-27T18:40:08.507 回答
39

这是因为如果您使用的是 jdk 9 或更高版本的 java 版本,只需将其添加到您的 pom

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>
于 2018-10-29T06:34:04.703 回答
27

为了解决这个问题,我在我的项目中导入了一些 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. 在 Java Build Path 中添加导入的 JAR 文件
于 2018-01-23T14:53:48.187 回答
20

在编译时以及运行时,添加开关--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

于 2017-04-25T04:35:12.573 回答
14

2019 年 4 月更新

JAXB 版本的 Changelong 位于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 工件的 Maven 坐标

jakarta.xml.bind:jakarta.xml.bind-api:JAXB 的 API 类。需要针对 JAXB 进行编译。

org.glassfish.jaxb:jaxb-runtime:JAXB 的实现,用于将 java 对象序列化和反序列化到/从 xml 的运行时。

JAXB fat-jar 包:

com.sun.xml.bind:jaxb-impl:JAXB 运行时胖 jar。

与 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

原始答案

我的 Maven 项目中,我应该为 JAXB RI 使用哪些工件? 在 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,然后选择配置文件。

于 2018-05-06T03:19:44.633 回答
13

我还使用Java 11偶然发现了 ClassNotFoundException:javax.xml.bind.DatatypeConverter和

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

我在添加 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

你不会找到更高版本的 jjwt 依赖项,因为它们拆分了包。

干杯。

于 2020-04-03T09:32:58.233 回答
12

您可以使用--add-modules=java.xml.bindJVM 选项将 xml 绑定模块添加到 JVM 运行时环境。

例如:java --add-modules=java.xml.bind XmlTestClass

于 2017-10-10T19:27:40.473 回答
12

这对我有用。仅添加 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>
于 2017-12-04T18:24:27.967 回答
12

转到您的 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'
于 2018-07-08T18:51:27.257 回答
11

使用 JDK 9+ 时需要添加 JAX-B 依赖项。对于 Android Studio 用户,您需要将其添加到您build.gradledependencies {}块中:

// 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"
}
于 2020-02-06T03:07:06.710 回答
11

我在Debian 10中处理Java 项目时遇到了这个问题。

每次我启动应用程序时,它都会在日志文件中引发错误:

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

这是我解决它的方法

当类路径中缺少JAXB库(用于 XML 绑定的 Java 架构)时,通常会导致该问题。JAXB 包含在 Java SE 10 或更早版本中,但它从 Java 11 或更高版本的 Java SE 中删除 - 移至 Jakarta EE 项目下的 Java 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 Architecture for XML Binding)在类路径中丢失。JAXB 包含在其中。

为了解决这个问题,我必须将JAXB API库添加到我的 tomcat 安装的lib ( ) 目录中:/opt/tomcat/lib

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

就这样。

于 2020-10-06T08:45:55.450 回答
9

对于 Java Web Start Execution,我们可以像这样使用 Andy Guibert 的建议:

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

请注意 --add-modules 中的额外“=”。请参阅此 OpenJDK Ticket或Java 平台标准版 Oracle JDK 9 迁移指南的“了解运行时访问警告”中的最后一条注释。

于 2017-09-29T08:34:41.277 回答
9

在 pom.xml 中添加 javax.xml.bind 依赖

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
于 2018-10-17T19:02:41.073 回答
9

此问题的根本原因是使用 JDK11 的 Gradle 守护程序,您将 JAVA_HOME 设置为 JDK11 或在与 JDK11 一起运行的共享守护程序中运行 Gradle 任务。

对于安卓:

  1. 检查您的项目结构设置,您可以从那里将 JDK 更改为 JDK8。

  2. 您还可以设置一个 JAVA_HOME 并指向 java8 主目录。

于 2021-05-06T05:09:25.610 回答
8

由于 JavaEE 现在由https://jakarta.ee/管理,从 2.3.2 开始的新 Maven 坐标为:

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>
于 2019-04-11T06:55:21.327 回答
8

这解决了我在 Java 12 上运行 Apache Camel 2.24.1 的依赖项问题:

    <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>
于 2019-08-25T06:32:18.753 回答
7

我关注了这个 URL,下面的设置对我很有帮助。我在 Macbook Pro 中使用 Java 10 和 STS IDE。它就像一个魅力。

   <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>
于 2018-09-15T16:12:31.113 回答
6

2.0.5.RELEASE我在 Java 11 上使用 Spring Boot 时遇到了同样的问题。

单独添加javax.xml.bind:jaxb-api:2.3.0并不能解决问题。我还必须将 Spring Boot 更新到最新的 Milestone 2.1.0.M2,所以我认为这将在下一个正式版本中修复。

于 2018-09-29T04:25:20.320 回答
6

添加以下依赖项对我有用。

        <!-- 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>
于 2021-04-25T05:21:07.830 回答
5

正如官方文档所述:

升级时可能会遇到以下情况:

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

Hibernate 通常需要默认不再提供的 JAXB。您可以添加 java.xml.bind 模块以使用 Java9 或 Java10 恢复此功能(即使该模块已被弃用)。

从 Java11 开始,该模块不可用,因此您唯一的选择是添加 JAXB RI(从 Java9 开始,您可以这样做来代替添加 java.xml.bind 模块:


马文

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>

摇篮(build.gradle.kts):

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

摇篮(build.gradle)

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

如果您更愿意指定特定版本,请查看此处: https ://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime

于 2020-07-11T15:40:17.560 回答
4

不是答案,而是附录:我得到了因为groovysh如果 JAVA_HOME 指向 Java 9 安装(java version "9.0.1"准确地说)运行(Groovy 2.4.13)会失败:

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

解决方案是:

  • 转到 github.io 上的JAXB 项目“JAXB 在双重许可下获得许可 - CDDL 1.1 和 GPL 2.0 与类路径异常”

  • 下载jaxb-ri-2.3.0.zip

  • 解压缩您放置 Java 基础结构文件的任何位置(在我的情况下为/usr/local/java/jaxb-ri/)。可能存在其他解决方案(可能通过 SDKMAN,我不知道)

  • 确保 lib 子目录中的 jar 在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

它有效!

于 2018-01-04T20:46:57.093 回答
4

您只需要 1 个依赖项:

dependencies {
    implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")
于 2020-02-18T11:13:38.113 回答
2

好的,我一直遇到同样的问题,但我使用的是 Java 8,并且一直收到此错误,我尝试了大多数解决方案。但事实证明,即使我将全局 Java 版本设置为 8,我的 maven 仍然指向 java 9,只要我修复它一切正常。

对于可能遇到此类问题的任何人,请查看如何修复 Maven 以使用默认 Java

于 2018-02-22T11:39:27.933 回答
2

旧答案“通过切换到 amazoncorretto 解决了问题” 新闻答案:我使用了 corretto latest ,但与 jdk 1.8 类似。所以无论如何我们需要手动添加依赖项

于 2019-04-22T07:48:56.000 回答
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 -->
于 2019-06-08T20:01:22.503 回答
2

对我来说,在 Java 11 和 gradle 中,结果如下:

plugins {
      id 'java'
}

dependencies {
      runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}
于 2019-08-22T07:08:28.213 回答
2

您需要将 jaxb 依赖项添加到 maven。glassfish 实现版本 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>
于 2019-08-24T14:23:08.797 回答
2

我想给出一个关于这个异常的简单易行的解决方案,只需将android studio 版本降级到 4.1.1 或更低。确保你没有android studio arctic fox (2020.3.1) 版本,因为最新版本不支持android的旧项目。

于 2021-08-11T05:26:55.767 回答
1

我知道我迟到了,但我的错误最终需要一个不同的解决方案......也超级简单

我最初部署到 Tomcat 9 并意识到我需要 7 ......我忘记将我的类路径映射回 build.xml 中的 7 版本

希望这将在将来解决其他人的错误,他们设法像我一样忽略了这个简单的问题!

于 2018-10-26T19:37:24.390 回答
1

在将我的项目升级到 java 11 后我遇到了类似的问题,然后修复它升级到 spring boot 2.1.1,它显然支持 java 11,有帮助

于 2019-10-19T10:44:31.990 回答
1

SBT 解决方案

libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.1"
于 2019-10-25T06:11:06.813 回答
1

你可以使用这个依赖

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
于 2021-12-20T06:44:13.827 回答
0

这对我有用,我有一个用 Java 8 编译的 spring boot 项目,但我不知道为什么有一天我的 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 

就是这样,更多了解如何使用命令更新替代品

于 2019-06-04T11:27:57.890 回答
0

如果您仅通过添加此依赖项来调用 SOAP Web 服务(例如,使用jaxws-maven-plugin),则所有 JAXB 错误都会消失:

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

使用 Java 13 测试

于 2019-09-20T15:46:30.473 回答
0

对我来说它的简单解决方案(Mac用户)

  run in terminal -->   alias j8="export JAVA_HOME=`/usr/libexec/java_home -v 1.8`;java -version"

then run -->          j8

thats it !!(now run your mvn commands)

或者你可以在你的 .bash_profile 上面设置

于 2021-02-11T03:21:53.283 回答
0

我在应用程序中遇到了同样的问题,其中模块级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"
于 2021-08-25T21:13:50.587 回答