How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

我有一些使用 JAXB API 类 的代码,这些代码作为 Java 6/7/8 中 JDK 的一部分提供。当我 运行 与 Java 9 相同的代码时,在 运行 时我收到错误消息,指出无法找到 JAXB 类。

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

JAXB APIs 被认为是 Java EE APIs,因此不再包含在 Java SE 9 的默认类路径中。在 Java 11、他们完全去掉了JDK.

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

幸运的是,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!!!

如果您尝试用旧的 JDK 指定 --add-modules,它会崩溃,因为它是一个无法识别的选项。我建议以下两个选项之一:

  1. 您可以使用 JDK_JAVA_OPTIONS 环境变量设置任何 Java 仅限 9+ 的选项。 Java 9+ 的 java 启动器 automatically read 这个环境变量。
  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) 因为它们是 scheduled for removal in Java 11。因此 --add-module 方法将不再适用于 Java 11 开箱即用。

您在 Java 11 及以后需要做的是在类路径或模块路径中包含您自己的 Java EE API 副本。例如,您可以像这样将 JAX-B APIs 添加为 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 Reference Implementation page

有关 Java 模块化的完整详细信息,请参阅 JEP 261: Module System

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

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

这对我有用:

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

Maven

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

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

对于 Java Web 启动执行,我们可以使用 Andy Guibert 的建议,如下所示:

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

注意 --add-modules 中额外的“=”。参见 this OpenJDK Ticket or the last note in "Understanding Runtime Access Warnings" of the Java Platform, Standard Edition Oracle JDK 9 Migration Guide

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

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

在我的例子中(spring boot fat jar)我只是将以下内容添加到 pom.xml。

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

这对我有用。仅添加 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>

不是答案,而是附录:我得到了因为 运行 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

解决方案是:

  • 前往 github.io 处的 JAXB Project ("JAXB is licensed under a dual license - CDDL 1.1 and GPL 2.0 with Class-path Exception")

  • 下载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

而且有效!

None 这些解决方案在最近的 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>

为了解决这个问题,我在我的项目中导入了一些 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构建路径
  3. 中添加导入的JAR文件

好的,我一直遇到同样的问题,但我使用的是 Java 8,并且不断出现此错误,我尝试了大部分解决方案。但事实证明,我的 maven 仍然指向 java 9 even-though 我将全局 Java 版本设置为 8,一旦我修复它一切正常。

对于可能遇到此类问题的任何人,请查看 How to fix Maven to use default Java(已存档)

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

权威link在https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

Maven coordinates for JAXB artifacts

jakarta.xml.bind:jakarta.xml.bind-api: API classes for JAXB. Required to compile against JAXB.

org.glassfish.jaxb:jaxb-runtime: Implementation of JAXB, runtime used for serialization and deserialization java objects to/from xml.

JAXB fat-jar bundles:

com.sun.xml.bind:jaxb-impl: JAXB runtime fat jar.

In contrast to org.glassfish.jaxb artifacts, these jars have all dependency classes included inside. These artifacts does not contain JPMS module descriptors. In Maven projects org.glassfish.jaxb artifacts are supposed to be used instead.

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 中遵循 Which artifacts should I use for JAXB RI in my Maven project?,您可以使用如下配置文件:

<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,然后 select 配置文件。

转到您的 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,下面的设置对我很有帮助。我在 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>

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

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

在pom.xml

中添加javax.xml.bind依赖
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

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

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

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

中的 7 版本

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

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

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

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

旧答案"Problem resolved by switching to amazoncorretto" 新闻回答:我用的是最新的corretto,不过是类似jdk1.8。所以无论如何我们需要手动添加依赖项

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

就是这样,要了解更多信息,请查看 How to use the command update alternatives

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

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

plugins {
      id 'java'
}

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

您需要将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>

这解决了我的依赖问题 运行 Apache Camel 2.24.1 on 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>

如果您正在调用 SOAP Web 服务(例如,使用 jaxws-maven-plugin),只需添加此依赖项,所有 JAXB 错误就会消失:

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

测试 Java 13

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

SBT 的解决方案

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

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

你只需要 1 个依赖:

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

我也用 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 and jjwt 0.9.x and you face the ClassNotFoundException:javax.xml.bind.DatatypeConverter issue,

继续

jjwt 版本 0.11.x,但使用拆分包:https://github.com/jwtk/jjwt#install

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

干杯。

official documentation 所述:

When upgrading you may face the following:

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

Hibernate typically requires JAXB that’s no longer provided by default. You can add the java.xml.bind module to restore this functionality with Java9 or Java10 (even if the module is deprecated).

As of Java11, the module is not available so your only option is to add the JAXB RI (you can do that as of Java9 in place of adding the java.xml.bind module:


Maven

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

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

我在 Debian 10.

中处理 Java 项目 时遇到了这个问题

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

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

我是这样解决的:

这个问题通常是在类路径中缺少 JAXB 库(Java XML 绑定的体系结构)时引起的。 JAXB 包含在 Java SE 10 或更早版本中,但它已从 Java SE 从 Java 11 或更新版本中删除 – 移至 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 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

资源[Solved] java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

就这些了。

对我来说它的简单解决方案(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

中进行上述设置

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

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

此问题的根本原因是 Gradle 守护程序使用 JDK11,您可以将 JAVA_HOME 设置为 JDK11 或 运行您的 Gradle 共享守护进程中的任务 运行 JDK11.

对于Android:

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

  2. 您也可以设置一个JAVA_HOME并指向java8家。

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

项目

我在 App 中遇到了同样的问题,其中模块级别 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"

你可以使用这个依赖项

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

如果您使用的是 JDK 11,您只需将以下内容添加到您的 Gradle(app):

dependencies {
    ...
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
    ...
}

对我有用。