使用Java EE API替换不推荐使用的JPMS模块


180

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

  • 带有javax.activation包的java.activation
  • java.corbajavax.activityjavax.rmijavax.rmi.CORBA,和org.omg.*
  • javax.transaction包的java.transaction
  • java.xml.bind与所有javax.xml.bind.*软件包
  • java.xml.wsjavax.jwsjavax.jws.soapjavax.xml.soap,和所有javax.xml.ws.*
  • javax.annotation包的java.xml.ws.annotation

哪些维护的第三方工件提供了这些API?它们提供这些API的性能如何或它们必须提供哪些其他功能都没关系-重要的是,它们是这些模块/软件包的直接替代品吗?

为了更轻松地收集知识,我用到目前为止的知识进行了回答,并将答案设置为社区Wiki。我希望人们能扩展它而不是自己写答案。


在您投票关闭之前:

  • 是的,各个模块上已经存在一些问题,对此问题的答案当然会重复该信息。但是AFAIK并没有一点可以了解所有这些知识,我认为这具有很大的价值。
  • 要求图书馆推荐的问题通常被认为是题外话,因为“它们往往会吸引有目的的答案和垃圾邮件”,但我认为这并不适用。有效库的集合已明确标出:它们必须实现特定的标准。除此之外,没有其他问题,因此我认为意见和垃圾邮件风险不大。

6
您几乎可以在github.com/javaee下找到所有移入的内容,并在JEP 320上
Naman,

另请参阅InfoWorld Java路线图中的这篇2018-05-14文章 Paul Krill 形成Eclipse的Jakarta EE企业Java。副标题:Eclipse Foundation概述了将构成新的云原生,微服务友好型企业Java工作的39个项目,以及GlassFish的发展方式
Basil Bourque '18

2
它已从JDK 11中删除。如果您使用的是jdk 9或更高版本,则最好直接添加依赖关系,而不要使用“ --add-modules java.xml.bind”之类的东西
Anver Sadhat

Answers:


202

代替使用不推荐使用的Java EE模块,而使用以下构件。

JAF(java.activation

JavaBeans激活框架(现为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,否则它将没有独立版本的RMI-IIOP,或者Eclipse Foundation接管了API的管理(Java EE从JCP到Eclipse Foundation的管理过渡包括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>

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 Commons批注(在Maven Central上可用):

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

来源


如果模块jax-ws同时从jdk和com.sun.xml.ws依赖项读取,该怎么办?
nllsdfx

1
我不确定你到底在问什么。哪个模块读取jax-ws?如果模块图中有java.xml.ws,并且在类路径上有com.sun.xml.ws:jaxws-ri,则后者将被忽略(由于包拆分)。
Nicolai

好吧,我想在模块中使用com.sun.xml.ws:jaxws-ri而不是它,java.xml.ws因为后者已被弃用,并将被删除。然后我将依赖项添加到我的pom文件中,并出现错误“模块xyz从'java.xml.ws'和'java.xml.ws'读取包'javax.xml.ws'”。
nllsdfx

似乎最终解析了模块java.xml.ws,可能是由于--add-modules或因为某些其他模块需要它。您可以提出一个新问题,以便我们看看吗?
Nicolai

1
确实如此。有两个细节:(1)如果没有显式模块(即带有模块声明的显式模块)不依赖JAXB,您仍然可以将它们放在类路径中,而拆分包并不重要。(2)命令行选项--patch-module可以修复拆分。
尼古拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.