我有一些使用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再也找不到这些类了呢?
当前回答
我在App中遇到了同样的问题,在模块级别构建。gradle添加了视图绑定和数据绑定。
早些时候
viewBinding {
enabled = true
}
dataBinding {
enabled = true
}
解决
dataBinding {
enabled = true
}
在项目级构建中。Gradle使用如下
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"
其他回答
使用JDK 9+时,需要添加JAX-B依赖项。对于Android Studio用户,您需要将此添加到您的构建中。Gradle的dependencies{}块:
// Add missing dependencies for JDK 9+
if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
// If you're using @AutoValue or any libs that requires javax.annotation (like Dagger)
compileOnly 'com.github.pengrad:jdk9-deps:1.0'
compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
// If you're using Kotlin
kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
kapt "javax.xml.bind:jaxb-api:2.3.1"
kapt "com.sun.xml.bind:jaxb-impl:2.3.2"
// If you're using Java
annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
testAnnotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
testAnnotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
}
JAXB api被认为是Java EE api,因此不再包含在Java SE 9的默认类路径中。在Java 11中,它们完全从JDK中删除了。
Java 9引入了模块的概念,默认情况下,Java。Se聚合模块在类路径(或者更确切地说,模块路径)上可用。顾名思义,java。se聚合模块不包括传统上与Java 6/7/8绑定的Java EE api。
幸运的是,JDK 6/7/8中提供的这些Java EE api仍然在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
快速和肮脏的解决方案:(仅适用于JDK 9/10)
要使JAXB api在运行时可用,请指定以下命令行选项:
——添加模块java.xml.bind
但我仍然需要这与Java 8一起工作!!
如果尝试使用较旧的JDK指定——add-modules,将会失败,因为它是一个无法识别的选项。我建议有两个选择:
您可以使用JDK_JAVA_OPTIONS环境变量设置任何Java 9+选项。这个环境变量由java 9+的java启动器自动读取。 您可以添加-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模块。注意,这在Java 11上不起作用,因为Java .se.ee在Java 11中被删除了。
适当的长期解决方案:(JDK 9及以上版本)
上面列出的Java EE API模块都被标记为@Deprecated(forRemoval=true),因为它们在Java 11中被计划删除。因此——add-module方法将不再在Java 11开箱即用中工作。
在Java 11中需要做的是在类路径或模块路径中包含您自己的Java EE api副本。例如,你可以像这样添加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参考实现页。
有关Java模块化的详细信息,请参见JEP 261:模块系统
截至2022年7月,bind-api和jaxb-runtime的最新版本是4.0.0。所以你也可以用
<version>4.0.0</version>
…在这些依赖子句中。但是如果你这样做,包的名称已经从javax.xml.bind…jakarta.xml.bind……您将需要修改源代码以使用这些jar的后续版本。
对于Gradle或Android Studio开发者:(JDK 9及以上版本)
将以下依赖项添加到构建中。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"
}
你只需要一个依赖项:
dependencies {
implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")
我跟踪了这个URL,下面的设置真的帮助了我。我在Macbook Pro中使用带有STS IDE的Java 10。这招很管用。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
在编译和运行时,添加开关——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