我有一些使用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再也找不到这些类了呢?
当前回答
这解决了我在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>
其他回答
干净的解决方案为所有jdk >= 9
您需要向构建中添加两个依赖项
的jaxb-api jaxb实现
作为实现,我选择使用glassfish的参考实现来摆脱旧的com。Sun类/库。 因此,我添加了我的专业构建
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
注意,从版本2.3.1开始,您不需要添加javax。不再激活。(参见https://github.com/eclipse-ee4j/jaxb-ri/issues/1222)
对我来说,在Java 11和gradle这是什么工作:
plugins {
id 'java'
}
dependencies {
runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}
在编译和运行时,添加开关——add-modules java.xml.bind
javac --add-modules java.xml.bind <java file name>
java --add-modules java.xml.bind <class file>
JDK 9模块的良好介绍也可以在以下位置找到: https://www.youtube.com/watch?v=KZfbRuvv5qc
关于这个异常,我想给出一个简单易行的解决方案,只是将android studio版本降低到4.1.1或更低。确保你没有android工作室北极狐(2020.3.1)版本,因为最新版本不支持android的旧项目。
正如官方文件所述:
升级时,您可能会面临以下问题: 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