我有一些代码使用JAXB API类,它们是作为Java 6/7/8中JDK的一部分提供的.当我使用Java 9运行相同的代码时,在运行时我得到错误,指示无法找到JAXB类.
自Java 6以来,JAXB类已作为JDK的一部分提供,为什么Java 9不再能够找到这些类?
在我的1.6.0_16 JDK上工作,我使用Apache CXF 2.5.2从WSDL生成我的存根类,它使用最新的jaxb-api 2.2.我知道可以使用jaxb-api 2.1,但为了避免兼容性问题,我宁愿让它使用当前版本.由于我的JDK具有jaxb 2.1,因此构建失败并显示以下消息:
error at @XmlElementRef(name = "protocol", namespace = "urn:ch.beo.emc", type = JAXBElement.class, required = false)
Run Code Online (Sandbox Code Playgroud)
因此,我尝试使用以下依赖项使maven包含最新的jaxb api和impl.
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
虽然这两个jar已经添加到Eclipse中的Maven Dependencies中,但错误消息在Eclipse和Maven构建中仍然存在.
如何在我的Maven构建中包含这些jar并让它们在Eclipse和目标系统中使用?
PS:请在这里找到完整的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ch.beo</groupId>
<artifactId>emc.front</artifactId>
<version>3.1.3-SNAPSHOT</version>
<repositories>
<repository>
<id>jboss</id>
<name>JBoss</name>
<url>http://repository.jboss.org/maven2/</url>
</repository>
<repository>
<id>freehep</id>
<name>Freehep</name>
<url>http://java.freehep.org/maven2</url>
</repository>
<repository>
<id>JCurl</id>
<url>http://jcurl.berlios.de/m2/repo</url>
</repository>
<repository>
<id>JavaNet</id>
<url>http://download.java.net/maven/2/</url>
</repository>
<repository>
<id>djmaven2</id>
<url>http://www.fdvs.com.ar/djmaven2</url>
<name>DynamicJasper public Repository</name>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<defaultGoal>compile</defaultGoal>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory> …Run Code Online (Sandbox Code Playgroud) 当我尝试在运行时包含java.xml.bind时,我收到一条错误消息:
错误:自动模块不能与jlink一起使用:java.activation from file:... [url to javax.activation-api-1.2.0.jar in my gradle cache]
我在模块路径上使用这些工件:
"javax.xml.bind:jaxb-api:2.4.0"
"org.glassfish.jaxb:jaxb-runtime:2.4.0-b180830.0438"
Run Code Online (Sandbox Code Playgroud)
看来,使用JDK 11,模块已被删除,但尚未提供完全模块化的替换.所以jlink无法从它们创建运行时.
为什么外部替换不是正确的模块化,因为它们已经是JDK 10中的模块?
java.activation不仅没有模块化,它还有一个新的模块名称"jakarta.activation".请参阅https://eclipse-ee4j.github.io/jaf/#Latest_News 我相信会进一步破坏事情,因为依赖于该模块的所有内容都必须在jlink运行之前再次更改.