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

时间:2018-01-11 09:54:59

标签: java java-ee java-9 java-module

Java 9 deprecated six modules that contain Java EE APIs,他们很快就会going to be removed

    使用javax.activation
  • java.activation
  • java.corba 包含javax.activityjavax.rmijavax.rmi.CORBAorg.omg.*个套件
  • 带有javax.transaction包的
  • java.transaction
  • java.xml.bind 包含所有javax.xml.bind.*个包
  • java.xml.ws 包含javax.jwsjavax.jws.soapjavax.xml.soap和所有javax.xml.ws.*个套件
  • 带有javax.annotation包的
  • java.xml.ws.annotation

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

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

投票结束前:

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

10 个答案:

答案 0 :(得分:134)

请使用以下工件,而不是使用已弃用的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>

Source

CORBA( java.corba

来自JEP 320

  

除非第三方接管CORBA API,ORB实施,CosNaming提供商等的维护,否则将不会有独立版本的CORBA。第三方维护是可能的,因为Java SE平台支持CORBA的独立实现。相比之下,RMI-IIOP的API仅在Java SE中定义和实现。除非启动专用JSR来维护它,否则将不会有独立版本的RMI-IIOP,或者Eclipse的管理工作由Eclipse基金会接管(Java EE从JCP到Eclipse Foundation的管理权转移包括{ {3}}及其对CORBA和RMI-IIOP的实现。

JTA( java.transaction

独立版本:

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>1.2</version>
</dependency>

GlassFish;了解如何在类和模块路径上使用1.2和即将发布的1.3。)

JAXB( java.xml.bind

参考实施:

<!-- Java 6 = JAXB version 2.0   -->
<!-- Java 7 = JAXB version 2.2.3 -->
<!-- Java 8 = JAXB version 2.2.8 -->
<!-- Java 9 = JAXB version 2.3.0 -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.8</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.2.8</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.8</version>
</dependency>

Source; Source说明从哪里获取schemagenxjc。)

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>

JEP 320;还说明从哪里获取wsgenwsimport。)

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

Source(Maven Central提供):

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.1</version>
</dependency>

Java Commons Annotations

答案 1 :(得分:20)

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>

答案 2 :(得分:8)

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

答案 3 :(得分:6)

对于基于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被描述为“旧”,并且使用this answer来处理基于org.glassfish的东西,这些东西也带来了org.eclipse.yasson

现在情况真的很混乱,它可以正常工作,但是任何人都应该确保它是最好的替代品,对吧?

答案 4 :(得分:1)

对上述答案进行细微的改动(改进)---仅在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>

答案 5 :(得分:1)

我在Spring MVC项目中使用jdk 11 + ant + ivy。 我收到错误消息“ 程序包javax.jws不存在”,因此我在 classpath 中添加了 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中的类路径中

答案 6 :(得分:0)

我发现解决这些问题的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生成问题。

答案 7 :(得分:0)

我已经使用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> 

答案 8 :(得分:0)

如果在Talend(例如7.x)中存在此问题,则可以添加项目的Default 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-hotspot:确定
  • 采用JDK 11.0.9.101-hotspot:确定
  • AdoptJDK 15.0.1.9-hotspot:KO(但这是另一个问题:条件操作数类型Exception和TDieException不兼容)
  • Zulu-8.50.0.1017:好
  • Zulu-11.43.1015:确定

答案 9 :(得分:0)

如果您有同样的问题,请将以下依赖项添加到 pom.xml <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.3.3</version> </dependency>

然后使用 JAVA 8 作为替代 JRE。有关更多详细信息,请观看 https://www.youtube.com/watch?v=pgSJda16N54 视频,它对我有用。