用 JavaEEAPI 替换废弃的 JPMS 模块

Java9废弃了包含 JavaEEAPI 的六个模块,它们很快就会变成 将被移除:

  • 使用 javax.activation包激活
  • 使用 javax.activityjavax.rmijavax.rmi.CORBAorg.omg.*包的 java.corba
  • 使用 javax.transaction包执行 java.transaction
  • Bind ,包含所有 javax.xml.bind.*
  • 具有 javax.jwsjavax.jws.soapjavax.xml.soap和所有 javax.xml.ws.*包的 java.xml.ws
  • 使用 javax.annotation包注释

哪些维护的第三方工件提供了这些 API?无论他们如何提供这些 API,或者他们必须提供哪些其他特性,重要的是,他们是这些模块/软件包的替代品吗?

为了更容易地收集知识,我用我目前所知道的答案回答了问题,并将答案设置为一个社区维基。我希望人们扩展它,而不是写自己的答案。


在投票结束前:

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

不要使用已弃用的Java EE模块,而是使用以下构件。

于JAF (java.activation)

JavaBeans激活框架(现在是雅加达激活)是一个独立的技术(在Maven Central上可用):

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

()

CORBA (java.corba)

中320:

除非第三方接管CORBA api、ORB实现、CosNaming提供者等的维护,否则不会有独立的CORBA版本。第三方维护是可能的,因为Java SE平台支持CORBA的独立实现。相反,RMI-IIOP的API仅在Java SE中定义和实现。不会有RMI-IIOP的独立版本,除非有专门的JSR开始维护它,或者API的管理由Eclipse基金会接管(Java EE的管理从JCP到Eclipse基金会的过渡包括GlassFish及其CORBA和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)

自Java EE 改名为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参考实现页

可选运行时是阿比吉特·萨卡尔带大的

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)。

通用注释(java.xml.ws.annotation)

Java公共注解(在Maven Central上可用):

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

()

JDK9的JAXB (java.xml.bind)

在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>

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

我需要为基于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

现在的情况真的很混乱,它是有效的,但是人们怎么能确定它是最好的替代品,对吧?

我发现绕过这些问题的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的所有问题。

只是对上面的答案进行了微小的修改(改进)——这里的示例仅针对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>

我使用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>
我在我的spring 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>

如果你有这个问题在Talend(7。),你可以在项目的默认POM.xml中添加:

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

测试:

  • AdoptJDK 8.0.275.1-hotspot: OK
  • AdoptJDK 11.0.9.101-hotspot: OK
  • AdoptJDK 15.0.1.9-hotspot: KO(但这是另一个问题:不兼容的条件操作数类型Exception和TDieException)
  • Zulu-8.50.0.1017:好的
  • Zulu-11.43.1015:好的

如果遇到同样的问题,请将下面的依赖项添加到pom.xml中

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

然后使用JAVA 8作为替代JRE。欲了解更多细节,请参阅到这个视频,它对我有用。

到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>

注意:不要试图更新依赖项,就这样吧,这对我来说很有效。