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

Nic*_*lai 150 java java-ee java-9 java-module

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

  • javax.activation包的java.activation
  • java.corbajavax.activity,javax.rmi,javax.rmi.CORBA,和org.omg.*
  • javax.transaction包的java.transaction
  • 包含所有javax.xml.bind.*包的java.xml.bind
  • java.xml.wsjavax.jws,javax.jws.soap,javax.xml.soap,和所有javax.xml.ws.*
  • javax.annotation包的java.xml.ws.annotation

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

为了更容易收集知识,我回答了迄今为止我所知道的并将答案作为社区维基.我希望人们能够扩展它,而不是写出自己的答案.


在您投票结束之前:

  • 是的,已经有一些关于单个模块的问题,这个问题的答案当然会复制这些信息.但AFAIK没有任何一点可以了解所有这些,我认为这些有很大的价值.
  • 提出图书馆建议的问题通常被认为是偏离主题的,因为"他们倾向于吸引自以为是的答案和垃圾邮件",但我不认为这适用于此.明确描述了一组有效的库:它们必须实现特定的标准.除此之外别无其他,所以我没有看到很多意见和垃圾邮件的风险.

Nic*_*lai 165

不使用已弃用的Java EE模块,而是使用以下工件.

JAF(java.activation)

JavaBeans Activiation Framework是一种独立的技术(可在Maven Central上获得):

<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>javax.activation</artifactId>
    <version>1.2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

(来源)

CORBA(java.corba)

来自JEP 320:

除非第三方接管CORBA API,ORB实现,CosNaming提供商等的维护,否则将不会有独立版本的CORBA.第三方维护是可能的,因为Java SE平台支持CORBA的独立实现.相比之下,RMI-IIOP的API仅在Java SE中定义和实现.除非专门的JSR开始维护它,否则不会有RMI-IIOP的独立版本,或者Eclipse的管理工作由Eclipse Foundation接管(Java EE从JCP到Eclipse Foundation的管理过渡包括GlassFish及其CORBA和RMI-IIOP的实现).

JTA(java.transaction)

独立版:

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>1.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

(来源 ;看看如何使用1.2和即将到来1.3的课程和模块路径.)

JAXB(java.xml.bind)

参考实施:

<!-- API -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

(来源 ; JEP 320解释了获取jaxb-corejaxb-impl从).

JAX-WS(java.xml.ws)

参考实施:

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-ri</artifactId>
    <version>2.3.0</version>
    <type>pom</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

(来源 ;也解释了获取schemagenxjc从).

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

Java Commons Annotations(可在Maven Central上获得):

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

(来源)


小智 23

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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这对我在Java 10上工作.但是,对于`jaxb-api`和`jaxb-runtime`使用版本号为`2.3.0`的单个属性并不是一个好主意.[Glassfish运行时当前位于`2.3.0.1`](https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime),而API保持在`2.3.0`.我建议完全在Answer中删除`properties`元素,然后分别对每个`dependency`中的每个版本号进行硬编码. (5认同)
  • JAXB 2.3.[0|1] 将不再适用于 Java 11!见 https://github.com/eclipse-ee4j/jaxb-api/issues/78 (3认同)

小智 8

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

  • 我可以让它工作但我不得不从我的settings.xml中删除一个镜像.经过进一步检查后,我无法重现这是如何替代已弃用的软件包.相反,我发现这种依赖很好地工作:`<dependency> <groupId> javax.jws </ groupId> <artifactId> jsr181-api </ artifactId> <version> 1.0-MR1 </ version> </ dependency> (2认同)

vir*_*o47 8

我需要为基于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'
Run Code Online (Sandbox Code Playgroud)

(你可能需要compile或其他范围,runtimeOnly对我们来说足够了.)

我注意到https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core被描述为"旧",并且使用此答案也用于org.glassfish引入的基础内容org.eclipse.yasson.

现在它的情况非常糟糕,它有效,但是如何确定它是最好的替代品呢?


小智 5

上述答案只是一个微小的变化(改进)——此处仅针对 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>
Run Code Online (Sandbox Code Playgroud)


小智 5

我在我的 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下载 jar 并将其添加到您的类路径中build.xml

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

<dependency>
  <groupId>javax.jws</groupId>
  <artifactId>javax.jws-api</artifactId>
  <version>1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过 Maven 的依赖解析系统正确包含它:`&lt;dependency&gt; &lt;groupId&gt;javax.jws&lt;/groupId&gt; &lt;artifactId&gt;javax.jws-api&lt;/artifactId&gt;&lt;version&gt;1.1&lt;/version&gt; &lt;/dependency&gt;`它实际上正确解析了“javax.jws”类。 (2认同)