Maven 无法使用 OpenJDK 11 找到 jaxb-api,即使它存在于存储库中
Maven is not able to find jaxb-api with OpenJDK 11 even though its present in the repository
我有一台机器 Windows OS,用于构建几个 WAR 项目。它安装了Java 8。我正在使用 Maven 3.2.5 构建这些 WAR 项目。一切正常。但是由于 Java 8 将来会因为免费更新结束而成为一个问题,所以我考虑升级到 OpenJDK 11。
我下载了 OpenJDK 11 但没有安装它 因为我只是想在项目的 1 开始时尝试这个。我选择了 WAR 项目之一来检查 OpenJDK 11 是否正常工作。这个项目是使用 JHipster 和 Spring Boot 创建的。
我将此项目的 pom.xml 更改为使用 spring-boot.version to 2.1.2
和 java.verion to 11
并且还放置了 jaxb-api, jaxb-impl, jaxb-runtime
和 javax.activation
enteries(如下所示)以避免 jaxb 相关依赖Java 11.
中的错误
在 windows 命令提示符中,我将 JAVA_HOME
和 PATH
变量设置为 OpenJDK11,然后触发 mvn clean compile package
命令。正如预期的那样,所有与 jaxb 相关的依赖项都已下载到 maven 存储库中,但 maven 仍然抛出错误 NoClassDefFoundError: javax/xml/bind/JAXBException
而 jaxb-api jar 仍在 Maven 存储库中。我尝试再次触发命令,但没有成功。
任何人都可以指导我了解可能的根本原因或任何解决方法。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
原因可能是java9之后的模块,所以你应该创建一个模块-info.java文件,更详细的参考相关文档。
我使用以下 POM 得到了它
<properties>
<maven-jaxb2-plugin.version>0.14.0</maven-jaxb2-plugin.version>
</properties>
//
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0-b170127.1453</version>
</dependency>
</dependencies>
//
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>${maven-jaxb2-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
<schemaIncludes>
<include>*.wsdl</include>
</schemaIncludes>
</configuration>
</plugin>
</plugins>
</build>
显然,在使用 Java8 编写的 Java 项目中,只需要对各种组件进行 jar 升级即可支持 JDK11。除非您想在产品中创建模块化项目并且需要 Import/Export 个模块,否则不需要模块支持。
我已经升级了 Javaassist Jar 以及提到的那些,之后一切都开始正常工作。
<javassist.version>3.24.1-GA</javassist.version>
如问题本身所述
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</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.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>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
我也有同样的问题,我用的是spring-boot和java11。
这对我有帮助。
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
在start-class(如SpringBootApplication)中添加如下代码:
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
}
我有一台机器 Windows OS,用于构建几个 WAR 项目。它安装了Java 8。我正在使用 Maven 3.2.5 构建这些 WAR 项目。一切正常。但是由于 Java 8 将来会因为免费更新结束而成为一个问题,所以我考虑升级到 OpenJDK 11。
我下载了 OpenJDK 11 但没有安装它 因为我只是想在项目的 1 开始时尝试这个。我选择了 WAR 项目之一来检查 OpenJDK 11 是否正常工作。这个项目是使用 JHipster 和 Spring Boot 创建的。
我将此项目的 pom.xml 更改为使用 spring-boot.version to 2.1.2
和 java.verion to 11
并且还放置了 jaxb-api, jaxb-impl, jaxb-runtime
和 javax.activation
enteries(如下所示)以避免 jaxb 相关依赖Java 11.
在 windows 命令提示符中,我将 JAVA_HOME
和 PATH
变量设置为 OpenJDK11,然后触发 mvn clean compile package
命令。正如预期的那样,所有与 jaxb 相关的依赖项都已下载到 maven 存储库中,但 maven 仍然抛出错误 NoClassDefFoundError: javax/xml/bind/JAXBException
而 jaxb-api jar 仍在 Maven 存储库中。我尝试再次触发命令,但没有成功。
任何人都可以指导我了解可能的根本原因或任何解决方法。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
原因可能是java9之后的模块,所以你应该创建一个模块-info.java文件,更详细的参考相关文档。
我使用以下 POM 得到了它
<properties>
<maven-jaxb2-plugin.version>0.14.0</maven-jaxb2-plugin.version>
</properties>
//
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0-b170127.1453</version>
</dependency>
</dependencies>
//
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>${maven-jaxb2-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
<schemaIncludes>
<include>*.wsdl</include>
</schemaIncludes>
</configuration>
</plugin>
</plugins>
</build>
显然,在使用 Java8 编写的 Java 项目中,只需要对各种组件进行 jar 升级即可支持 JDK11。除非您想在产品中创建模块化项目并且需要 Import/Export 个模块,否则不需要模块支持。
我已经升级了 Javaassist Jar 以及提到的那些,之后一切都开始正常工作。
<javassist.version>3.24.1-GA</javassist.version>
如问题本身所述
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</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.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>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
我也有同样的问题,我用的是spring-boot和java11。 这对我有帮助。
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
在start-class(如SpringBootApplication)中添加如下代码:
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
}