我有一些使用JAXB API类的代码,这些类已作为Java 6/7/8中的JDK的一部分提供。当我用Java 9运行相同的代码时,在运行时得到错误,指示找不到JAXB类。
从Java 6开始,JAXB类就作为JDK的一部分提供了,那么为什么Java 9再也找不到这些类了呢?
我有一些使用JAXB API类的代码,这些类已作为Java 6/7/8中的JDK的一部分提供。当我用Java 9运行相同的代码时,在运行时得到错误,指示找不到JAXB类。
从Java 6开始,JAXB类就作为JDK的一部分提供了,那么为什么Java 9再也找不到这些类了呢?
当前回答
如果您正在调用SOAP web服务(例如,使用jaxws-maven-plugin),只需添加此依赖项,所有JAXB错误就会消失:
<dependency>
<groupId>org.glassfish.metro</groupId>
<artifactId>webservices-rt</artifactId>
<version>2.4.3</version>
</dependency>
使用Java 13进行测试
其他回答
你可以使用——add-modules=java.xml。bind JVM选项将xml绑定模块添加到JVM运行时环境。
例如:java——add-modules=java.xml。绑定XmlTestClass
对于Java Web Start执行,我们可以像这样使用Andy Guibert的建议:
<j2se version="1.6+"
java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>
注意——add-modules中额外的“=”。请参阅此OpenJDK票据或Java平台的“理解运行时访问警告”中的最后一个注释,标准版Oracle JDK 9迁移指南。
对我来说,在Java 11和gradle这是什么工作:
plugins {
id 'java'
}
dependencies {
runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}
正如官方文件所述:
升级时,您可能会面临以下问题: 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
这招对我很管用:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.7.0</version>
</dependency>
更新
正如@Jasper所建议的,为了避免依赖于整个EclipseLink库,你也可以只依赖于EclipseLink MOXy:
Maven
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.7.3</version>
</dependency>
Gradle
compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'
作为我的Java 8应用程序的依赖项,该应用程序生成一个*.jar,它可以在JRE 8或JRE 9上运行,没有额外的参数。
此外,在使用JAXB API之前,需要在某处执行此命令:
System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");
到目前为止,作为一种变通方法,效果很好。不过,这看起来并不是一个完美的解决方案……