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

Replacements for deprecated JPMS modules with Java EE APIs

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

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

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

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

在您投票结束之前:

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


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

JAF(java.activation)

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

1
2
3
4
5
<dependency>
    <groupId>com.sun.activation</groupId>
    javax.activation</artifactId>
    <version>1.2.0</version>
</dependency>

(资源)

CORBA(java.corba)

来自JEP 320:

There will not be a standalone version of CORBA unless third parties take over maintenance of the CORBA APIs, ORB implementation, CosNaming provider, etc. Third party maintenance is possible because the Java SE Platform endorses independent implementations of CORBA. In contrast, the API for RMI-IIOP is defined and implemented solely within Java SE. There will not be a standalone version of RMI-IIOP unless a dedicated JSR is started to maintain it, or stewardship of the API is taken over by the Eclipse Foundation (the transition of stewardship of Java EE from the JCP to the Eclipse Foundation includes GlassFish and its implementation of CORBA and RMI-IIOP).

JTA(java.transaction)

独立版:

1
2
3
4
5
<dependency>
    <groupId>javax.transaction</groupId>
    javax.transaction-api</artifactId>
    <version>1.2</version>
</dependency>

(来源;看一下如何在类和模块路径上使用1.2和即将到来的1.3。)

JAXB(java.xml.bind)

参考实施:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 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>
    jaxb-api</artifactId>
    <version>2.2.8</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    jaxb-core</artifactId>
    <version>2.2.8</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    jaxb-impl</artifactId>
    <version>2.2.8</version>
</dependency>

(来源; JEP 320解释了从哪里获得schemagenxjc。)

JAX-WS(java.xml.ws)

参考实施:

1
2
3
4
5
6
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    jaxws-ri</artifactId>
    <version>2.3.0</version>
    <type>pom</type>
</dependency>

(来源;还解释了从哪里获得wsgenwsimport。)

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

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

1
2
3
4
5
<dependency>
    <groupId>javax.annotation</groupId>
    javax.annotation-api</artifactId>
    <version>1.3.1</version>
</dependency>

(资源)


JDK9的JAXB(java.xml.bind)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<properties>
    <jaxb-api.version>2.3.0</jaxb-api.version>
</properties>

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


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

1
2
3
4
5
6
7
8
9
// 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,它显然可以从存储库http://download.eclipse.org/rt/eclipselink/maven.repo找到


只是上述答案的一个小变化(改进)---仅适用于JAXB。可以使用runtime作用域添加依赖项,并且只有在有效需要时才这样做(例如,在版本> = 9时运行JRE时运行---这里以v11为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<profile>
        <id>when-on-jdk-11</id>
       
            <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>
                jaxb-api</artifactId>
                <version>${jaxb-api.version}</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                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不再可用。

1
2
3
4
5
6
7
8
9
10
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        jaxb-runtime</artifactId>
        <version>2.4.0-b180830.0438</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        rt</artifactId>
        <version>2.3.1</version>
    </dependency>


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <project ...>
      <dependencyManagement>
        <dependencies>
          <!-- ... -->
          <!-- Gone from jvm in java11 -->
          <dependency>
          <groupId>com.sun.xml.bind</groupId>
          jaxb-ri</artifactId>
          <version>2.4.0-b180830.0438</version>
          <scope>import</scope>
          <type>pom</type>
        </dependency>
        <!-- ... -->
      </dependencies>
    </dependencyManagement>
    </project>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <!-- ... -->
    <dependencies>
      <!-- Gone from jvm in java11 -->
      <dependency>
         <groupId>javax.xml.bind</groupId>
         jaxb-api</artifactId>
      </dependency>
      <dependency>
         <groupId>com.sun.xml.bind</groupId>
         jaxb-impl</artifactId>
         <scope>runtime</scope>
      </dependency>
      <dependency>
         <groupId>org.glassfish.jaxb</groupId>
         jaxb-runtime</artifactId>
         <scope>runtime</scope>
      </dependency>
      <!-- ... -->
    </dependencies>  
    <!-- ... -->

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