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

JAXB类从Java6开始就作为JDK的一部分提供,所以为什么Java9再也找不到这些类了?

推荐答案

JAXB API被认为是JavaEE API,因此不再包含在JavaSE9的默认类路径中.在Java11中,它们完全从JDK中移除.

Java9引入了模块的概念,默认情况下,类路径(或者更确切地说,模块路径)上有java.se个聚合模块.顾名思义,java.se聚合模块not确实包括传统上与Java 6/7/8Bundle 在一起的JavaEEAPI.

幸运的是,JDK 6/7/8中提供的这些JavaEEAPI仍在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

Quick and dirty solution: (JDK 9/10 only)

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

--add-modules java.xml.bind

But I still need this to work with Java 8!!!

如果您try 使用较旧的JDK指定--add-modules,它将会失败,因为这是一个无法识别的选项.我建议从两个选项中 Select 一个:

  1. 可以使用JDK_JAVA_OPTIONS环境变量设置任何仅适用于Java 9+的选项.Java 9+的java启动器将此环境变量设置为automatically read.
  2. 您可以添加-XX:+IgnoreUnrecognizedVMOptions,使JVM默默地忽略无法识别的选项,而不是爆炸.但要当心!JVM将不再为您验证您使用的任何其他命令行参数.此选项适用于Oracle/OpenJDK以及IBM JDK(从JDK 8sr4开始).

Alternate quick solution: (JDK 9/10 only)

请注意,您可以通过指定--add-modules java.se.ee选项使上面的所有JavaEE模块在运行时都可用.java.se.ee模块是一个聚合模块,它包括java.se.ee以及上面的JavaEE API模块.请注意,这是doesn't work on Java 11,因为在Java11中删除了java.se.ee.


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

上面列出的JavaEEAPI模块都标记为@Deprecated(forRemoval=true),因为它们在Java 11中是scheduled for removal.因此--add-module方法将不再适用于Java11开箱即用.

在Java11和forward中,您需要做的是在类路径或模块路径中包含您自己的JavaEEAPI副本.例如,可以将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 Reference Implementation page.

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

For Gradle or Android Studio developer: (JDK 9 and beyond)

将以下依赖项添加到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"
}

Java相关问答推荐

Kotlin ReadWriteProperty:无法使用T作为具体化类型参数.改为使用类

无法在Java中将hhmmss格式的时间解析为LocalTime

gitlab ci不会运行我的脚本,因为它需要数据库连接'

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

了解Android Studio中的调试器输出

JUnit—如何模拟局部变量对象方法调用

暂停计时器

Com.example.service.QuestionService中的构造函数的参数0需要找不到的类型为';com.example.Dao.QuestionDao;的Bean

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

Spring Security不允许加载js

Docker不支持弹性APM服务器

如何在代码中将行呈现在矩形前面?

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

如何制作回文程序?

根据应用程序 Select 的语言检索数据

为什么我的登录终结点不能被任何请求访问?

";home/runner/work/中没有文件...匹配到[**/pom.xml];Maven项目的构建过程中出现错误

Java返回生成器的实现

JOOQ:批处理CRUD操作使用动态表定义,如何?