Java 9 deprecated six modules that contain Java EE APIs,他们很快就会going to be removed:
javax.activation
包 javax.activity
,javax.rmi
,javax.rmi.CORBA
和org.omg.*
个套件javax.transaction
包的javax.xml.bind.*
个包javax.jws
,javax.jws.soap
,javax.xml.soap
和所有javax.xml.ws.*
个套件javax.annotation
包的哪些维护的第三方工件提供了这些API?它们提供这些API或它们必须提供的其他功能并不重要 - 重要的是,它们是这些模块/包的直接替代品吗?
为了更容易收集知识,我回答了目前为止我所知道的并将答案作为社区维基。我希望人们能够扩展它而不是写出自己的答案。
投票结束前:
答案 0 :(得分:134)
请使用以下工件,而不是使用已弃用的Java EE模块。
JavaBeans Activiation Framework是一种独立的技术(可在Maven Central上获得):
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
(Source)
来自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的实现。
独立版本:
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.2</version>
</dependency>
(GlassFish;了解如何在类和模块路径上使用1.2
和即将发布的1.3
。)
参考实施:
<!-- 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说明从哪里获取schemagen
和xjc
。)
参考实施:
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.0</version>
<type>pom</type>
</dependency>
(JEP 320;还说明从哪里获取wsgen
和wsimport
。)
Source(Maven Central提供):
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
答案 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>
经过以下测试:
答案 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 视频,它对我有用。