我有一些代码使用JAXB API类,这些类是Java 6/7/8中JDK的一部分.当我使用Java 9运行相同的代码时,在运行时会出现错误,表明找不到JAXB类.
JAXB类从Java6开始就作为JDK的一部分提供,所以为什么Java9再也找不到这些类了?
我有一些代码使用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 一个:
JDK_JAVA_OPTIONS
环境变量设置任何仅适用于Java 9+的选项.Java 9+的java
启动器将此环境变量设置为automatically read.-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
.
上面列出的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"
}