我有一些代码,使用了作为Java 6/7/8 JDK的一部分提供的JAXB API类。当我在Java 9中运行相同的代码时,运行时会出现指示找不到JAXB类的错误。
JAXB类自Java 6以来已经作为JDK的一部分提供,那么为什么Java 9找不到这些类了呢?
JAXB类自Java 6以来已经作为JDK的一部分提供,那么为什么Java 9找不到这些类了呢?
在Java 11和Gradle中,以下方法对我行之有效:
plugins {
id 'java'
}
dependencies {
runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
编译Java 8目标时需要使用的依赖版本。在Java 8、11和12 JRE中测试应用程序。
<!-- replace dependencies that have been removed from JRE's starting with Java v11 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.8</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.8-b01</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.8-b01</version>
</dependency>
<!-- end replace dependencies that have been removed from JRE's starting with Java v11 -->
最初的回答是"通过切换到amazoncorretto解决了问题" 新的回答是:我使用了最新的corretto,但它与jdk 1.8类似。所以无论如何我们都需要手动添加依赖项。
amazoncorretto:latest
目前提供的是 JDK 8 而不是 11。许多 Docker 镜像仍然基于 JDK 8,这正是由于 JDK 8 --> 11 之间 API 移除所引起的兼容性问题。 - Andy Guibert<!-- API -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.1"
org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre
)。升级安装的 JREs 到 1.8(我需要的版本)解决了这个问题。希望能有所帮助。