jee8 - Reemplazos para módulos JPMS obsoletos con API Java EE
oracle jee8 (7)
En lugar de usar los módulos Java EE en desuso, use los siguientes artefactos.
JAF ( java.activation )
JavaBeans Activiation Framework es una tecnología independiente (disponible en Maven Central):
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
( Source )
CORBA ( java.corba )
Desde JEP 320 :
No habrá una versión independiente de CORBA a menos que terceros se hagan cargo del mantenimiento de las API de CORBA, la implementación de ORB, el proveedor de CosNaming, etc. El mantenimiento de terceros es posible porque la Plataforma Java SE respalda implementaciones independientes de CORBA. Por el contrario, la API para RMI-IIOP se define e implementa únicamente dentro de Java SE. No habrá una versión independiente de RMI-IIOP a menos que se inicie un JSR dedicado para mantenerlo, o la administración de la API sea asumida por la Fundación Eclipse (la transición de la administración de Java EE del JCP a la Fundación Eclipse incluye GlassFish y su implementación de CORBA y RMI-IIOP).
JTA ( java.transaction )
Versión independiente:
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.2</version>
</dependency>
(
Fuente
; vea cómo usar
1.2
y el próximo
1.3
en la ruta de clase y módulo).
JAXB ( java.xml.bind )
Implementación de referencia:
<!-- 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
;
JEP 320
explica de dónde obtener
schemagen
y
schemagen
).
JAX-WS ( java.xml.ws )
Implementación de referencia:
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.0</version>
<type>pom</type>
</dependency>
(
Fuente
; también explica de dónde obtener
wsgen
y
wsimport
).
Anotaciones comunes ( java.xml.ws.annotation )
Anotaciones de Java Commons (disponible en Maven Central):
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
( Source )
Java 9 desaprobó seis módulos que contienen API Java EE y se eliminarán pronto:
-
java.activation
con el paquete
javax.activation
-
java.corba
con
javax.activity
,javax.rmi
,javax.rmi.CORBA
yorg.omg.*
paquetes -
java.transaction
con el paquete
javax.transaction
-
java.xml.bind
con todos los paquetes
javax.xml.bind.*
-
java.xml.ws
con
javax.jws
,javax.jws.soap
,javax.xml.soap
y todos los paquetesjavax.xml.ws.*
-
java.xml.ws.annotation
con el paquete
javax.annotation
¿Qué artefactos de terceros mantenidos proporcionan esas API? No importa qué tan bien proporcionen esas API o qué otras características tengan para ofrecer. Lo único que importa es si son un reemplazo directo para estos módulos / paquetes.
Para facilitar la recopilación de conocimientos, respondí con lo que sé hasta ahora e hice la respuesta un wiki de la comunidad. Espero que la gente lo extienda en lugar de escribir sus propias respuestas.
Antes de votar para cerrar:
- Sí, ya hay algunas preguntas sobre módulos individuales y una respuesta a esta pregunta, por supuesto, duplicaría esa información. Pero AFAIK no hay un punto único para aprender sobre todo esto, lo que creo que tiene mucho valor.
- Las preguntas que solicitan recomendaciones de la biblioteca generalmente se consideran fuera de tema, porque "tienden a atraer respuestas obstinadas y spam", pero no creo que eso se aplique aquí. El conjunto de bibliotecas válidas está claramente delineado: tienen que implementar un estándar específico. Más allá de eso, nada más importa, así que no veo mucho riesgo de opinión y spam.
Encontré que el camino más fácil para sortear las partes JAXB de estos problemas era usar la administración de dependencias en mi root pom o en mi 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>
Y en los módulos que fallan la compilación en 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>
<!-- ... -->
Además, actualizar la versión de
org.jvnet.jaxb2.maven2:maven-jaxb2-plugin
a 0.14.0 resolvió todos los problemas de generación de jaxb para mí.
He experimentado con la mayoría de las sugerencias descritas anteriormente usando JDK 11.0.3 y no he tenido éxito. La única solución que finalmente encontré que funciona es la siguiente. Quizás hay otras opciones que también funcionan, pero parece que la selección de la versión es crítica. Por ejemplo, cambiar com.sun.xml.ws:rt a 2.3.2 hace que el módulo javax.jws ya no esté disponible.
<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>
Necesitaba reemplazar JAX-WS (java.xml.ws) y JAXB (java.xml.bind) para mi aplicación basada en Spring Boot 2 y terminé con estos JAR (construcción de 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''
(Es posible que necesite
compile
u otro alcance,
runtimeOnly
fue suficiente para nosotros).
Me di cuenta de que
https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core
se describe como "Viejo" y el uso de
esta respuesta
fue para cosas basadas en
org.glassfish
que trajeron
org.eclipse.yasson
como bien.
Ahora es una situación realmente desordenada, funciona, pero ¿cómo debería alguien estar seguro de que es el mejor reemplazo, verdad?
Parece que jaxws-ri depende transitivamente de commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 que aparentemente se puede encontrar en el repositorio http://download.eclipse.org/rt/eclipselink/maven.repo
Solo una pequeña variación (mejora) en las respuestas anteriores --- ejemplificada aquí solo para JAXB.
Se pueden agregar las dependencias con el alcance de
runtime
y solo si esto es realmente necesario (es decir, cuando se compila para ejecutarse en un JRE con versión> = 9 --- aquí se ejemplifica 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>
JAXB (java.xml.bind) para JDK9
Funciona perfectamente en mis aplicaciones de escritorio en 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>