Tengo un código que usa clases de API JAXB que se han proporcionado como parte del JDK en Java 6/7/8. Cuando ejecuto el mismo código con Java 9, en tiempo de ejecución obtengo errores que indican que no se pueden encontrar las clases JAXB.
Las clases JAXB se han proporcionado como parte del JDK desde Java 6, entonces, ¿por qué Java 9 ya no puede encontrar estas clases?
Respuestas:
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, eljava.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:
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:JDK_JAVA_OPTIONS
variable de entorno. Esta variable de entorno se lee automáticamente por eljava
lanzador para Java 9+.-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. Eljava.se.ee
módulo es un módulo agregado que incluyejava.se.ee
, además de los módulos API Java EE anteriores. Tenga en cuenta que esto no funciona en Java 11 porquejava.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:
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:fuente
javax.xml.bind
clases de JavaEE y otras están programadas para su eliminación en Java 11, según JEP-320 .java.se.ee
módulo se ha eliminado, por lo que la--add-modules
solución ya no funciona. Utilice la solución recomendada en su lugar: agregue JAXB como una dependencia separada.En mi caso (spring boot fat jar) solo agrego lo siguiente a pom.xml.
fuente
testCompile('javax.xml.bind:jaxb-api')
funcionó para mí.<scope>runtime</scope>
para tal casoNinguna de estas soluciones funcionó bien para mí en el reciente JDK 9.0.1.
Descubrí que esta lista de dependencias es suficiente para un funcionamiento adecuado, por lo que no necesita especificar explícitamente
--add-module
(aunque se especifica dentro de los pom de estas dependencias). Lo único que necesita es especificar esta lista de dependencias:fuente
pom.xml
archivo de la configuración de Maven. Si no sabe qué es eso, entonces es mejor comenzar desde el principio<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>
como última dependencia.Esto funcionó para mí:
Actualizar
Como sugirió @Jasper, para evitar depender de toda la biblioteca EclipseLink, también puede depender de EclipseLink MOXy:
Maven
Gradle
Como dependencias para mi aplicación Java 8, que produce un * .jar que puede ejecutar JRE 8 o JRE 9 sin argumentos adicionales.
Además, esto debe ejecutarse en algún lugar antes de que se use la API JAXB:
Funciona muy bien hasta ahora, como una solución alternativa. Sin embargo, no parece una solución perfecta ...
fuente
org.eclipse.persistence:eclipselink
solo para obtener las API JAXB es una dependencia muy pesada, a menos que ya esté usando eclipselink?-XX:+IgnoreUnrecognizedVMOptions
opción de línea de comando (actualicé mi respuesta con detalles)org.eclipse.persistence
, artifactIdorg.eclipse.persistence.moxy
.solución limpia para todos los JDK> = 9
Necesita agregar dos dependencias a su compilación
Como implementación, elegí usar la implementación de referencia de glassfish para deshacerme de las antiguas clases / bibliotecas com.sun. Como resultado, agregué mi construcción maven
Tenga en cuenta que desde la versión 2.3.1 ya no necesita agregar javax.activation. (ver https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )
fuente
es porque la versión de Java si está utilizando jdk 9 o una versión posterior simplemente agregue esto a su pom
fuente
Para resolver esto, he importado algunos archivos JAR en mi proyecto:
http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
fuente
com.sun.xml.bind
artefactos son antiguos y se proporcionan solo para compatibilidad con versiones anteriores. En su lugar, debe usar losorg.glassfish.jaxb
artefactos equivalentes , como se menciona en algunas de las otras respuestas.En el momento de la compilación y el tiempo de ejecución, agregue el interruptor
--add-modules java.xml.bind
JDK 9
También puede encontrar una buena introducción de los módulos en: https://www.youtube.com/watch?v=KZfbRuvv5qcfuente
Esto funcionó para mí. Agregar solo jaxb-api no fue suficiente.
fuente
com.sun.xml.bind
artefactos son antiguos y se proporcionan solo para compatibilidad con versiones anteriores. En su lugar, debe usar losorg.glassfish.jaxb
artefactos equivalentes , como se menciona en algunas de las otras respuestas.Vaya a Your Build.gradle y agregue las siguientes dependencias para Java 9 o Java 10.
fuente
Puede usar la
--add-modules=java.xml.bind
opción JVM para agregar un módulo de enlace xml al entorno de tiempo de ejecución JVM.P.ej:
java --add-modules=java.xml.bind XmlTestClass
fuente
Actualización de abril de 2019
Changelong para las versiones JAXB está en https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html
extractos:
El enlace autorizado está en https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 extrae:
Respuesta original
Siguiente ¿Qué artefactos debo usar para JAXB RI en mi proyecto Maven? en Maven, puedes usar un perfil como:
El árbol de dependencias muestra:
Para usar esto en Eclipse, diga Oxygen.3a Release (4.7.3a) o posterior, Ctrl-Alt-P, o haga clic derecho en el proyecto, Maven, luego seleccione el perfil.
fuente
javax.xml.bind
>jaxb-api
que he visto en otros lugares es realmente redundante. La dependencia de glassfish tira es así. Acabo de intentar eso, y de hecho funciona.Para Java Web Start Execution podemos usar la sugerencia de Andy Guibert de esta manera:
Tenga en cuenta el "=" extra en los módulos --add. Consulte este Ticket de OpenJDK o la última nota en "Descripción de las advertencias de acceso en tiempo de ejecución" de la Plataforma Java, Guía de migración de Oracle JDK 9 de edición estándar .
fuente
agregar dependencia javax.xml.bind en pom.xml
fuente
Dado que JavaEE ahora se rige por https://jakarta.ee/ , las nuevas coordenadas de Maven a partir de 2.3.2 son:
https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts
El primer jaxb.version lanzado es 2.3.2.
fuente
Seguí esta URL y la configuración a continuación realmente me ayudó. Yo uso Java 10 con STS IDE en Macbook Pro. Funciona a las mil maravillas.
fuente
Esto resolvió mis problemas con las dependencias que ejecutan Apache Camel 2.24.1 en Java 12:
fuente
Encontré el mismo problema al usar Spring Boot
2.0.5.RELEASE
en Java 11.Agregar
javax.xml.bind:jaxb-api:2.3.0
solo no solucionó el problema. También tuve que actualizar Spring Boot al último Milestone2.1.0.M2
, así que supongo que esto se solucionará en el próximo lanzamiento oficial.fuente
Debe agregar dependencias JAX-B cuando use JDK 9+. Estudio para Android del usuario, tendrá que añadir a su
build.gradle
'sdependencies {}
bloque:fuente
También tropecé con ClassNotFoundException: javax.xml.bind.DatatypeConverter usando Java 11 y
Intenté todo esto al agregar javax.xml.bind: jaxb-api o spring boot jakarta.xml.bind-api ... Encontré una pista para las soluciones en jjwt versión 0.10.0 ... pero lo más importante es que el paquete jjwt es ahora dividido!
Por lo tanto, verifique esta referencia: https://github.com/jwtk/jjwt/issues/510
Simplemente, si usas
ir por
jjwt versión 0.11.x, pero use los paquetes divididos: https://github.com/jwtk/jjwt#install
Maven no encontrará una versión superior para la dependencia jjwt, ya que dividen los paquetes.
Salud.
fuente
No es una respuesta, sino un apéndice: obtuve porque ejecutar
groovysh
(Groovy 2.4.13) si JAVA_HOME apunta a una instalación de Java 9 (java version "9.0.1"
para ser precisos) falla abismalmente:La solución fue:
Vaya al Proyecto JAXB en github.io ( "JAXB tiene una licencia dual: CDDL 1.1 y GPL 2.0 con excepción de ruta de clase" )
Descargar
jaxb-ri-2.3.0.zip
Descomprima donde sea que coloque sus archivos de infraestructura de Java (en mi caso
/usr/local/java/jaxb-ri/
). Puede existir otra solución (tal vez a través de SDKMAN, no sé)Asegúrese de que los frascos en el subdirectorio lib estén en el
CLASSPATH
. Lo hago a través de un script iniciado en el inicio de bash, llamado/etc/profile.d/java.sh
, donde agregué (entre muchas otras líneas) el siguiente bucle:Empaquetado en una función ...
¡Y funciona!
fuente
Solo necesitas 1 dependencia:
fuente
OK, he tenido el mismo tipo de problema, pero estaba usando Java 8 y seguí recibiendo este error, probé la mayoría de las soluciones. Pero resulta que mi experto todavía apuntaba a Java 9, aunque configuré la versión global de Java en 8, tan pronto como solucioné que todo funcionaba.
Para cualquiera que pueda tener este tipo de problema, consulte Cómo arreglar Maven para usar Java predeterminado
fuente
Respuesta anterior "Problema resuelto cambiando a amazoncorretto" Respuesta de noticias: Utilicé corretto más reciente, pero es similar a jdk 1.8. así que de todos modos necesitamos agregar dependencias manualmente
fuente
amazoncorretto:latest
actualmente da JDK 8, no 11. Muchas imágenes de Docker todavía se basan en JDK 8, precisamente debido a los problemas de compatibilidad causados por la eliminación de API entre JDK 8 -> 11Las versiones de dependencia que necesitaba usar al compilar para el destino Java 8. Aplicación probada en Java 8, 11 y 12 JRE.
fuente
Para mí en Java 11 y Gradle, esto es lo que funcionó:
fuente
Necesita agregar dependencias jaxb a maven. La implementación de glassfish versión 2.3.2 es perfectamente compatible con la nueva jakarta EE jaxb api versión 2.3.2.
fuente
Tuve problemas similares después de actualizar mi proyecto a Java 11, luego lo que solucionó fue actualizar a Spring Boot 2.1.1 que aparentemente tiene soporte para Java 11, esto ayudó
fuente
Sé que llego tarde a la fiesta, pero mi error terminó necesitando una solución diferente ... super simple también
Originalmente me desplegué en Tomcat 9 y me di cuenta de que necesitaba 7 ... Olvidé asignar mi ruta de clase a la versión 7 en build.xml
¡Esperemos que esto solucione el error de alguien más en el futuro, que logra pasar por alto este simple problema como lo hice yo!
fuente
Si está llamando a servicios web SOAP (por ejemplo, usando
jaxws-maven-plugin
) simplemente agregando esta dependencia, todos los errores JAXB desaparecerán:Probado con Java 13
fuente