Java Maven无法找到带有OpenJDK 11的jaxb api,即使它存在于存储库中
我有一台装有Windows操作系统的机器,它用于构建一些战争项目。它安装了Java8。我正在使用Maven 3.2.5构建这些战争项目。一切正常。但是,由于Java8的免费更新即将结束,它在未来将成为一个问题,所以我想升级到OpenJDK11 我下载了OpenJDK 11,但没有安装它,因为我只是想在项目开始时尝试一下。我拿起一个WAR项目来检查OpenJDK11是否有效。这个项目是使用JHipster和Spring Boot创建的。 我将这个项目的pom.xml改为使用Java Maven无法找到带有OpenJDK 11的jaxb api,即使它存在于存储库中,java,maven,spring-boot,java-11,Java,Maven,Spring Boot,Java 11,我有一台装有Windows操作系统的机器,它用于构建一些战争项目。它安装了Java8。我正在使用Maven 3.2.5构建这些战争项目。一切正常。但是,由于Java8的免费更新即将结束,它在未来将成为一个问题,所以我想升级到OpenJDK11 我下载了OpenJDK 11,但没有安装它,因为我只是想在项目开始时尝试一下。我拿起一个WAR项目来检查OpenJDK11是否有效。这个项目是使用JHipster和Spring Boot创建的。 我将这个项目的pom.xml改为使用spring-boot.
spring-boot.version到2.1.2
,将java.verion改为11
,并将jaxb api、jaxb impl、jaxb runtime
和javax.activation
条目(如下所示)放在java 11中,以避免与jaxb相关的依赖性错误
在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>
javax.xml.bind
jaxb api
2.3.0
com.sun.xml.bind
jaxb impl
2.3.0
org.glassfish.jaxb
jaxb运行时
2.3.0
javax.activation
激活
1.1.1
原因可能是java9之后的模块,因此您应该创建一个module-info.java文件,更多详细信息请参阅相关文档。我在使用以下POM时得到了这个结果
<properties>
<maven-jaxb2-plugin.version>0.14.0</maven-jaxb2-plugin.version>
</properties>
0.14.0
//
javax.servlet
javax.servlet-api
4.0.1
假如
javax.xml.bind
jaxb api
2.4.0-b180830.0359
javax.activation
激活
1.1
org.glassfish.jaxb
jaxb运行时
2.3.0-b170127.1453
//
org.springframework.boot
springbootmaven插件
org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
${maven-jaxb2-plugin.version}
生成
${project.basedir}/src/main/resources/wsdl
*.wsdl
显然,在使用Java8编写的Java项目中,支持JDK11只需要对各种组件进行JAR升级。在您希望在产品中创建模块化项目并需要导入/导出模块之前,不需要模块支持
我已经升级了javaassistjar以及上面提到的那些,之后一切都开始正常工作
<javassist.version>3.24.1-GA</javassist.version>
3.24.1-GA
正如问题本身所提到的
<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>
org.glassfish.jaxb
jaxb运行时
2.3.2
javax.xml.bind
jaxb api
2.3.1
com.sun.xml.bind
jaxb内核
2.2.11
com.sun.xml.bind
jaxb impl
2.2.11
javax.activation
javax.activation-api
1.2.0
我也有同样的问题,我使用spring boot和java 11。
这对我有帮助
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
org.glassfish.jaxb
jaxb运行时
将以下代码添加到start类中(例如SpringBootApplication):
首先使用Maven 3.6.0。我猜这可能与“拆分包”问题有关,即具有相同包名的类不能位于两个不同的jar文件中。这将导致类加载问题。编辑您的问题并将添加的依赖项发布到pom.xml中。@Michael-O将Maven更新为3.6.0,但仍然存在相同的错误。您是将库打包到WAR文件中,还是从应用程序平台导入库?因为NoClassDefFoundError通常意味着“我找到了类,但我没有访问它的权限”。在我的项目中创建module-info.java并添加:module com.abc{requires java.xml.bind;}但是运气不好,相同的问题我已经做了前两个更改,并且得到了相同的错误。第三个变化的意义是什么。对不起,我不明白这里的wsdl。这是您的示例代码位置吗?即使在完成所有提到的更改之后,我也会遇到相同的错误
<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>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
}