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

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


当前回答

您需要向maven添加jaxb依赖项。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>

其他回答

正如官方文件所述:

升级时,您可能会面临以下问题: java.lang.NoClassDefFoundError: javax / xml /绑定/ JAXBException Hibernate通常需要缺省情况下不再提供的JAXB。你可以 在Java9中添加java.xml.bind模块来恢复此功能 或Java10(即使该模块已弃用)。 从Java11开始,该模块不可用,所以您唯一的选择是 添加JAXB RI(您可以在Java9中这样做,以代替添加 java.xml.bind模块:


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

这解决了我在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>

对我来说,这是一个简单的解决方案(Mac用户)

run in terminal——> alias j8="export JAVA_HOME= ' /usr/libexec/ JAVA_HOME -v 1.8 '; 然后执行——> j8 就是这样!!(现在运行你的MVN命令)

或者你可以在你的.bash_profile中设置

我还碰到了ClassNotFoundException:javax.xml.bind。DatatypeConverter使用Java 11和

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

我尝试了添加javax.xml的所有方法。绑定: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依赖,因为他们把包分开了。

欢呼。

你只需要一个依赖项:

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