如何解决java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException?

1233
我有一些代码,使用了作为Java 6/7/8 JDK的一部分提供的JAXB API类。当我在Java 9中运行相同的代码时,运行时会出现指示找不到JAXB类的错误。
JAXB类自Java 6以来已经作为JDK的一部分提供,那么为什么Java 9找不到这些类了呢?

2
这个回答中的附加部分与这些API的迁移有关。 - Naman
10
使用Java 8构建代码可以让你的代码编译通过,但是当你尝试在Java 9+上运行已编译的代码时,会因为缺少JAX-B而失败。 - Andy Guibert
2
对于Java 11,本文的解决方案是最新的:https://crunchify.com/java-11-and-javax-xml-bind-jaxbcontext/ - Eric
请参见 http://wiki.bitplan.com/index.php/Java8 上的 Java 8 相关编程内容。 - Wolfgang Fahl
这个回答解决了你的问题吗?使用Java EE API替换已弃用的JPMS模块 - 9ilsdx 9rvj 0lo
显示剩余2条评论
45个回答

3

在Java 11和Gradle中,以下方法对我行之有效:

plugins {
      id 'java'
}

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

我们把它放在哪里? - nyxee
如果你正在使用Gradle,在你的build.gradle文件中。 - silver_mx

2
如果您正在使用JDK 8或更高版本,请按照以下步骤操作:
  1. 添加javax.xml.bind依赖项
<dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
</dependency>
  1. 清理 Maven
  2. 安装 Maven

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

最初的回答是"通过切换到amazoncorretto解决了问题" 新的回答是:我使用了最新的corretto,但它与jdk 1.8类似。所以无论如何我们都需要手动添加依赖项。


3
Amazon Corretto 11 JDK发行版不提供javax.xml.bind类。如果问题在切换到Corretto后得到解决,那么可能是因为您降级到了JDK 8。 - Andy Guibert
奇怪,我会检查一下,在 Docker 中我使用的是最新版本的 Correto。 - Armen Arzumanyan
是的,amazoncorretto:latest 目前提供的是 JDK 8 而不是 11。许多 Docker 镜像仍然基于 JDK 8,这正是由于 JDK 8 --> 11 之间 API 移除所引起的兼容性问题。 - Andy Guibert

2
你需要在maven中添加jaxb依赖。Glassfish实现版本2.3.2与新的Jakarta EE jaxb API版本2.3.2完全兼容。"Original Answer"翻译成"最初的答案"。
<!-- 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后遇到了类似的问题,然后通过升级到Spring Boot 2.1.1解决了这个问题。显然,Spring Boot 2.1.1支持Java 11,this 有所帮助。

请考虑在您的回答中至少添加解决方案的部分,因为仅包含链接的答案如果未来URL更改将无效。 - yukashima huksay

1
我知道我来晚了,但我的错误最终需要一个不同的解决方案...而且非常简单。
我最初部署到Tomcat 9,后来意识到我需要7...我忘记在build.xml中将我的类路径映射回7版本。
希望这能修复未来其他人的错误,他们可能会像我一样忽视这个简单的问题!

2
虽然这可能会帮助OP,但最好添加更多的细节、示例等。 - Til

1

SBT的解决方案

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

1
对我来说,Eclipse 2020-12 (4.18.0) 使用的是内置的 (org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre)。升级安装的 JREs 到 1.8(我需要的版本)解决了这个问题。希望能有所帮助。

这对我在Eclipse中构建Java 8 Maven项目有所帮助。在Java 17的情况下,不需要传递可变参数。 - undefined

1
如果您正在使用Spring Boot 3版本, 您可以降级到2.7.7 并将所有的 jakarta 改为 javax 这对我起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接