Las API JAXB se consideran API Java EE y, por lo tanto, ya no están incluidas en la ruta de clase predeterminada en Java SE 9. En Java 11, se eliminan por completo del JDK.
Java 9 presenta los conceptos de módulos y, de forma predeterminada, el java.se
módulo agregado está disponible en el classpath (o más bien, module-path). Como su nombre lo indica, el java.se
módulo agregado no incluye las API Java EE que se han incluido tradicionalmente con Java 6/7/8.
Afortunadamente, estas API Java EE que se proporcionaron en JDK 6/7/8 todavía están en el JDK, pero simplemente no están en el classpath de forma predeterminada. Las API extra de Java EE se proporcionan en los siguientes módulos:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Solución rápida y sucia: (solo JDK 9/10)
Para que las API JAXB estén disponibles en tiempo de ejecución, especifique la siguiente opción de línea de comandos:
--add-modules java.xml.bind
¡Pero todavía necesito esto para trabajar con Java 8!
Si intenta especificar --add-modules
con un JDK anterior, explotará porque es una opción no reconocida. Sugiero una de dos opciones:
- Puede configurar cualquier opción solo de Java 9+ utilizando la
JDK_JAVA_OPTIONS
variable de entorno. Esta variable de entorno se lee automáticamente por el java
lanzador para Java 9+.
- Puede agregar el
-XX:+IgnoreUnrecognizedVMOptions
para hacer que la JVM ignore silenciosamente las opciones no reconocidas, en lugar de explotar. ¡Pero cuidado! La JVM ya no validará ningún otro argumento de línea de comandos que utilice. Esta opción funciona con Oracle / OpenJDK, así como con IBM JDK (a partir de JDK 8sr4).
Solución rápida alternativa: (solo JDK 9/10)
Tenga en cuenta que puede hacer que todos los módulos Java EE anteriores estén disponibles en tiempo de ejecución especificando la --add-modules java.se.ee
opción. El java.se.ee
módulo es un módulo agregado que incluye java.se.ee
, además de los módulos API Java EE anteriores. Tenga en cuenta que esto no funciona en Java 11 porque java.se.ee
se eliminó en Java 11.
Solución adecuada a largo plazo: (JDK 9 y más allá)
Los módulos de API Java EE enumerados anteriormente están marcados @Deprecated(forRemoval=true)
porque están programados para su eliminación en Java 11 . Por lo tanto, el --add-module
enfoque ya no funcionará en Java 11 fuera de la caja.
Lo que deberá hacer en Java 11 y en adelante es incluir su propia copia de las API de Java EE en la ruta de clase o ruta del módulo. Por ejemplo, puede agregar las API JAX-B como una dependencia de Maven como esta:
<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
Consulte la página de Implementación de referencia de JAXB para obtener más detalles sobre JAXB.
Para obtener detalles completos sobre la modularidad de Java, consulte JEP 261: Sistema de módulos
Para desarrolladores de Gradle o Android Studio: (JDK 9 y más allá)
Agregue las siguientes dependencias a su build.gradle
archivo:
dependencies {
// JAX-B dependencies for JDK 9+
implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}