用 Java EE API 替换已弃用的 JPMS 模块



Java9 弃用了六个包含 Java EE API 的模块,它们将很快被删除:

  • java.activationwithjavax.activationpackage
  • java.corba包含javax.activityjavax.rmijavax.rmi.CORBAorg.omg.*
  • java.transactionwithjavax.transaction
  • package
  • java.xml.bind与所有javax.xml.bind.*软件包
  • java.xml.wsjavax.jwsjavax.jws.soapjavax.xml.soap和所有javax.xml.ws.*软件包
  • java.xml.ws.annotationwithjavax.annotation
  • package

哪些维护的第三方项目提供这些 API?他们提供这些 API 或必须提供哪些其他功能并不重要 - 重要的是,它们是这些模块/包的直接替代品吗?

为了更容易收集知识,我用我目前所知道的回答,并将答案变成了社区维基。我希望人们能够扩展它,而不是写自己的答案。


在投票关闭之前:

  • 是的,已经有一些关于各个模块的问题,这个问题的答案当然会重复这些信息。但是AFAIK没有单一的点可以了解所有这些,我认为这有很大的价值。
  • 要求图书馆推荐的问题通常被认为是题外话,因为"它们往往会吸引固执己见的答案和垃圾邮件",但我认为这不适用于这里。有效库的集合被清楚地描述:它们必须实现特定的标准。除此之外,其他一切都不重要,所以我不认为意见和垃圾邮件的风险很大。

不要使用不推荐使用的 Java EE 模块,而是使用以下工件。

JAF (java.activation)

JavaBeans Activation Framework(现在的Jakarta Activation)是一项独立的技术(在Maven Central上可用):

<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>jakarta.activation</artifactId>
<version>1.2.2</version>
</dependency>

(来源)

CORBA (java.corba)

从 JEP 320 开始:

除非第三方接管 CORBA API、ORB 实现、CosNaming 提供程序等的维护,否则不会有独立版本的 CORBA。第三方维护是可能的,因为 Java SE 平台认可 CORBA 的独立实现。相比之下,RMI-IIOP 的 API 仅在 Java SE 中定义和实现。除非启动专用的JSR来维护RMI-IIOP,或者API的管理权由Eclipse基金会接管(Java EE的管理权从JCP到Eclipse基金会的过渡包括GlassFish及其CORBA和RMI-IIOP的实现),否则不会有RMI-IIOP的独立版本。

JTA (java.transaction)

独立版本:

<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
<version>1.3.3</version>
</dependency>

(来源)

JAXB (java.xml.bind)

自从JavaEE更名为Jakarta EE以来,JAXB现在由新的工件提供:

<!-- API -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- Runtime -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.3</version>
<scope>runtime</scope>
</dependency>
<!-- Alternative runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
<scope>runtime</scope>
</dependency>

JAXB 参考实现页面。

替代运行时由 @Abhijit Sarkar 提出,因为它已被弃用com.sun.xml.bind:jaxb-impl

schemagenxjc也可以作为独立 JAXB 发行版的一部分从那里下载。

另请参阅链接答案。

JAX-WS (java.xml.ws)

参考实现:

<!-- API -->
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- Runtime -->
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3</version>
</dependency>

独立分发下载(包含wsgenwsimport)。

Common Annotations (java.xml.ws.annotation)

Java Commons Annotations(可在Maven Central上使用):

<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
</dependency>

(来源)

JAXB (java.xml.bind) for JDK9

在 jdk9/10 EA 上的桌面应用程序中完美运行

<properties>
<jaxb-api.version>2.3.0</jaxb-api.version>
</properties>
<!-- JAXB 2.3.0 for jdk9+ -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb-api.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb-api.version}</version>
</dependency>
<!-- JAXB needs javax.activation module (jdk9) -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>

我需要为我的基于 Spring Boot 2 的应用程序替换 JAX-WS (java.xml.ws) 和 JAXB (java.xml.bind),最终得到了这些 JAR(Gradle 构建):

// replacements for deprecated JDK module java.xml.ws
runtimeOnly 'javax.xml.ws:jaxws-api:2.3.0' // javax.xml.ws.* classes
runtimeOnly 'javax.jws:jsr181-api:1.0-MR1' // for javax.jws.* classes
// replacement for deprecated JDK module java.xml.bind
runtimeOnly 'javax.xml.bind:jaxb-api'
runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:2.3.0.1'
runtimeOnly 'org.glassfish:javax.json:1.1.2'
runtimeOnly 'org.eclipse:yasson:1.0.1'

(您可能需要compile或其他范围,runtimeOnly对我们来说就足够了。

我注意到 https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core 被描述为"旧",并且使用此答案用于基于org.glassfish的东西,这些东西也带来了org.eclipse.yasson

现在情况真的很混乱,它有效,但谁应该确定它是最好的替代品,对吧?

似乎 jaxws-ri 从 commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852 传递地依赖于 commonj.sdo:commonj.sdo:jar,这显然可以从存储库中找到 http://download.eclipse.org/rt/eclipselink/maven.repo

我在我的春季 mvc 项目中使用 jdk 11 + ant + ivy。 我收到错误"包javax.jws不存在",所以我将javax.jws-api-1.1.jar添加到类路径中,它起作用了!只需从 https://repo1.maven.org/maven2/javax/jws/javax.jws-api/1.1/javax.jws-api-1.1.jar 下载罐子 并将其添加到build.xml中的类路径中

或者将其添加到您的pom.xml

<dependency>
<groupId>javax.jws</groupId>
<artifactId>javax.jws-api</artifactId>
<version>1.1</version>
</dependency>

只是对上述答案的微小变化(改进),---仅针对 JAXB 举例说明。可以使用runtime范围添加依赖项,并且只有在有效需要时才这样做(即,当构建为在版本为>= 9 的 JRE 中运行时---此处举例说明 v11):

<profile>
<id>when-on-jdk-11</id>
<activation>
<jdk>11</jdk>
</activation>
<properties>
<!-- missing artefacts version properties -->
<jaxb-api.version>2.3.1</jaxb-api.version>
<jaxb-impl.version>2.3.2</jaxb-impl.version> <!-- one might let it the same with the jaxb-api.version -->
</properties>
<dependencies>
<!-- runtime dependencies to avoid JAXB related CNF exceptions when running on Java 11 (e.g.: ClassNotFoundException: javax.xml.bind.annotation.XmlType) -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb-api.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb-impl.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>

如果您在 Talend(例如 7.x)中遇到此问题,您可以添加项目的默认 POM.xml:

<dependencies>
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>javax.xml.soap-api</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>

测试:

  • 采用JDK 8.0.275.1-热点:确定
  • 采用JDK 11.0.9.101-热点:确定
  • 采用JDK 15.0.1.9-hotspot:KO(但这是另一个问题:不兼容的条件操作数类型异常和TDieException)
  • 祖鲁语-8.50.0.1017:确定
  • 祖鲁语-11.43.1015:好的

我已经使用 JDK 11.0.3 尝试了上述大多数建议,但没有成功。我最终发现唯一可行的解决方案如下。也许还有其他选项也有效,但似乎版本的选择至关重要。例如,将 com.sun.xml.ws:rt 更改为 2.3.2 会导致模块 javax.jws 不再可用。

<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.4.0-b180830.0438</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>rt</artifactId>
<version>2.3.1</version>
</dependency> 

截至 2022 年,这确实是一个真正的痛苦! 我尝试了许多上述建议,但只能让它与以下依赖项一起使用。

<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0.1</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-impl</artifactId>
<version>2.3.1</version>
</dependency>

<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>

注意:不要试图更新依赖项,只需保持这种方式,它对我有用。

如果您有同样的问题,请将以下依赖项添加到pom.xml

<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3</version>
</dependency>

然后使用 JAVA 8 作为备用 JRE。有关更多详细信息,请参阅此视频,该视频对我有用。

我发现解决这些问题的JAXB部分的最简单方法是在我的根pom或bom中使用依赖管理:

<project ...>
<dependencyManagement>
<dependencies>
<!-- ... -->
<!-- Gone from jvm in java11 -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-ri</artifactId>
<version>2.4.0-b180830.0438</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!-- ... -->
</dependencies>
</dependencyManagement>
</project>

在 jdk11 上编译失败的模块中:

<!-- ... -->
<dependencies>
<!-- Gone from jvm in java11 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<scope>runtime</scope>
</dependency>
<!-- ... -->
</dependencies>  
<!-- ... -->

此外,将org.jvnet.jaxb2.maven2:maven-jaxb2-plugin的版本更新到 0.14.0 为我解决了所有 jaxb 生成问题。

最新更新