我有一些代码使用JAXB API类,这些类是作为Java 6/7/8中JDK的一部分提供的。当我使用Java 9运行相同的代码时,在运行时会出现错误,指示找不到JAXB类。
JAXB类自Java 6以来一直作为JDK的一部分提供,那么为什么Java 9不能再找到这些类呢?
最佳答案
jaxbapi被认为是javaeeapi,因此不再包含在Java SE 9的默认类路径中。在Java 11中,它们完全从JDK中删除。
Java 9引入了模块的概念,默认情况下,java.se
聚合模块在类路径(或者更确切地说,模块路径)上可用。顾名思义,java.se
聚合模块不包括传统上与Java 6/7/8捆绑在一起的javaeeapi。
幸运的是,这些在JDK 6/7/8中提供的javaeeapi仍然在JDK中,但是默认情况下它们不在类路径上。额外的javaeeapi在以下模块中提供:
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)
要使JAXB api在运行时可用,请指定以下命令行选项:
--add-modules java.xml.bind
但我仍然需要这个与Java8一起工作!!!
如果您尝试用一个旧的JDK指定
--add-modules
,它会爆炸,因为它是一个无法识别的选项。我建议两种选择之一:您可以使用
JDK_JAVA_OPTIONS
环境变量设置任何仅限Java9+的选项。此环境变量由Java 9+的启动程序java
执行automatically read。您可以添加
-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模块。正确的长期解决方案:(JDK 9及以上)
上面列出的Java EE API模块都标记为
@Deprecated(forRemoval=true)
,因为它们在scheduled for removal中Java 11。因此,--add-module
方法将不再适用于Java 11的开箱即用。在Java 11和forward中需要做的是在类路径或模块路径上包含自己的javaeeapi副本。例如,可以将JAX-bapi添加为maven依赖项,如下所示:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
有关Java模块化的完整详细信息,请参见JEP 261: Module System
对于Gradle或Android Studio开发人员:(JDK 9及更高版本)
将以下依赖项添加到build.gradle文件中:
dependencies {
// JAX-B dependencies for JDK 9+
implementation "javax.xml.bind:jaxb-api:2.2.11"
implementation "com.sun.xml.bind:jaxb-core:2.2.11"
implementation "com.sun.xml.bind:jaxb-impl:2.2.11"
implementation "javax.activation:activation:1.1.1"
}