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



java.activation with javax.activation package

java带有javax.activityjavax.rmijavax.rmi.CORBAorg.omg.*软件包的.corba

带有javax.transaction软件包的java.transaction

java.xml.bind与所有javax.xml.bind.*软件包

带有javax.jwsjavax.jws.soapjavax.xml.soap和所有javax.xml.ws.*软件包的java.xml.ws

带有javax.annotation软件包的java.xml.ws.annotation

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

以使其变得更容易为了收集知识,我用到目前为止的知识回答了这个问题,并将答案做成了社区Wiki。我希望人们能扩展它,而不是写自己的答案。


在投票结束之前:


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


评论

您几乎可以在github.com/javaee下找到所有这些动静的对象,并在JEP 320上找到一些细节的链接:删除Java EE和CORBA模块

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

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

#1 楼

代替使用不推荐使用的Java EE模块,请使用以下工件。
JAF(java.activation)
JavaBeans Activation Framework(现为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>
 

(源)

评论


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

–nllsdfx
18年5月16日在14:14

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

– Nicolai Parlog
18年5月16日在14:17



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

–nllsdfx
18年5月16日在14:27



看起来模块java.xml.ws毕竟已经解析了,可能是由于--add-modules或其他一些模块需要它。您能提出一个新问题,以便我们看看吗?

– Nicolai Parlog
18年5月16日在14:44

确实如此。有两个细节:(1)如果没有显式模块(即带有模块声明的显式模块)不依赖JAXB,您仍然可以将它们放在类路径中,而拆分包并不重要。 (2)命令行选项--patch-module可以修补拆分。

– Nicolai Parlog
18-10-2在21:23

#2 楼

适用于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>
 


评论


谢谢,这对我在Java 10上有效。但是,对于jaxb-api和jaxb-runtime都使用单个属性作为版本号2.3.0并不是一个好主意。 Glassfish运行时当前为2.3.0.1,而API仍为2.3.0。我建议将属性元素完全放在“答案”中,然后分别对每个依赖项中的每个版本号进行硬编码。

–罗勒·布尔克
18年7月17日在22:40



我的建议:在中,以某个版本(当前最新为2.3.0.1)导入org.glassfish.jaxb:jaxb-bom BOM,然后在实际的部分中,不要为任何jaxb指定版本-api或jaxb运行时。版本号将从BOM中获取,这将确保它们始终同步并一起升级。

–AndrewF
18年11月8日在3:26



JAXB 2.3。[0 | 1]将不再适用于Java 11!见github.com/eclipse-ee4j/jaxb-api/issues/78

–col.panic
18/12/12在9:46

#3 楼

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

现在情况确实很混乱,它可以工作,但是任何人都应该怎么做确定是最好的替代品,对吧?

评论


我们也在使用gradle,但是我什么也没得到。试图将Maven解决方案转换为gradle,但没有成功。您的示例对我有用(尽管未提供编译,但提供了使用,我尝试迁移的项目正在使用vertx)。感谢您的分享,确实,我也希望很快能对gradle进行一些说明:)

– Lars
18-09-20在11:14

请注意,情况发展很快-就在不久前,我将另一个项目移至Spring Boot 2.2,其中Jakarta API更为突出,但我们仍然需要实现。为此,我仍然使用org.glassfish。*东西。每当我使用Spring Boot项目时,我都倾向于检查它们的依赖版本附录并尽可能地遵守(将当前版本更改为所需的版本):docs.spring.io/spring-boot/docs/current/reference/html/ …

–virgo47
6月15日17:56



#4 楼

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

评论


可能是因为它更适合评论而不是答案。无论如何,您是否能够解决问题?我似乎无法检索依赖关系。 mvn -U全新安装总是说找不到工件commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852。

– Zyl
18年7月2日在15:42

我不是Maven专家,但是似乎在pom.xml中未声明任何存储库的情况下正在找到commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852。如果pom.xml中有存储库(例如spring-snapshot),则还必须添加download.eclipse.org/rt/eclipselink/maven.repository,例如 my-id eclipse-repo download.eclipse.org/rt/eclipselink/maven.repo ps。如果我的声誉足够高,我本来会添加评论而不是答案:)

–theNikki1
18年7月3日在8:11



我可以使其正常工作,但还必须从settings.xml中删除一个镜像。但是,在进一步检查之后,我无法复制这是如何代替已淘汰的包装的。相反,我发现此依赖项效果很好: javax.jws jsr181-api 1.0-MR1

– Zyl
18年7月4日在15:31



我能够排除软件包sdo-eclipselink-plugin

–约瑟夫·欲望
18/12/11在22:41

#5 楼

对上述答案的改动很小(改进)---仅在JAXB上举例说明。可以在有效的情况下(例如,当构建为在版本> = 9的JRE中运行时构建-在这里以v11为例)添加带有runtime范围的依赖项:

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


#6 楼

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


#7 楼

我在我的春季mvc项目中使用jdk 11 + ant +常春藤。
我收到错误消息“包javax.jws不存在”,所以我向类路径中添加了javax.jws-api-1.1.jar并成功了! br />只需从https://repo1.maven.org/maven2/javax/jws/javax.jws-api/1.1/javax.jws-api-1.1.jar下载jar并将其添加到您的您的build.xml中的类路径

评论


您可以通过Maven的依赖关系解析系统正确地包含它: javax.jws javax.jws-api 1.1 及其实际上可以正确解析“ javax.jws”类。

– msteiger
8月7日6:59

#8 楼

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

#9 楼

如果您在Talend(例如7.x)中遇到此问题,则可以添加项目的默认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:OK
Zulu-11.43.1015:OK