当前位置: 首页 > 知识库问答 >
问题:

如何解析java.lang.NoClassDefoundError:javax/xml/bind/jaxbException

俞飞鸣
2023-03-14

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

JAXB类从Java 6开始就作为JDK的一部分提供了,那么为什么Java 9再也找不到这些类了呢?

共有3个答案

刘胜泫
2023-03-14

在最近的JDK9.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>
王才英
2023-03-14

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

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
裴俊豪
2023-03-14

JAXB API被认为是Java EE API,因此不再包含在Java SE9的默认类路径中。在《Java 11》中,它们完全从JDK中删除。

Java 9引入了模块的概念,默认情况下,Java.se聚合模块在类路径(或者更确切地说是module-path)上可用。顾名思义,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)

要使JAXBAPI在运行时可用,请指定以下命令行选项:

--add-modules java.xml.bind

但是我仍然需要这个来和Java 8一起工作!!!

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

  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中被删除了。

上面列出的Java EE API模块都标记为@deprecated(forremoval=true),因为它们计划在Java 11中删除。因此--add-module方法在Java 11中不再适用。

在Java 11和forward中,您需要做的是在类路径或模块路径中包含您自己的Java EE API副本。例如,可以将JAX-BAPI添加为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"
}
 类似资料:
  • 问题内容: 如何解析包含数据的XML 我们如何解析xml并获取包含在???中的数据? 问题答案: (http://www.java2s.com/Code/Java/XML/GetcharacterdataCDATAfromxmldocument.htm)

  • 问题内容: 我有一些使用JAXB API类的代码,这些类作为Java 6/7/8中JDK的一部分提供。当我使用Java 9运行相同的代码时,在运行时出现错误,指示找不到JAXB类。 自Java 6以来,JAXB类已经作为JDK的一部分提供了,那么Java 9为什么不能再找到这些类? 问题答案: JAXB API被认为是Java EE API,因此不再包含在Java SE 9的默认类路径中。在Jav

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax Implementation 让我

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax实现 让我们从实现开始。 你首先必须

  • 问题内容: 我想知道使用shellscript解析XML文件的最佳方法是什么? 应该一个人手工做吗? 第三层图书馆是否存在? 如果您已经做到了,请告诉我您是如何做到的 问题答案: 您可以尝试xmllint xmllint程序解析一个或多个XML文件,这些文件在命令行上指定为xmlfile。根据选择的选项,它会打印各种类型的输出。这对于检测XML代码和XML解析器中的错误很有用 它允许您使用–pat

  • 问题内容: 如何解析XML,以及如何使用jQuery浏览结果?这是我的示例XML: 我想通过此路径找到节点-> -> -> ? 问题答案: 有此功能: 您可以像这样使用它: 如果您确实想要一个对象,则需要一个插件。