Saltar al contenido

Java: Cómo resolver java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException

Solución:

Las API de JAXB se consideran API de Java EE y, por lo tanto, ya no están incluidas en la ruta de clases predeterminada en Java SE 9. En Java 11, se eliminan por completo del JDK.

Java 9 introduce los conceptos de módulos y, por defecto, el java.se El módulo agregado está disponible en classpath (o mejor dicho, module-path). Como su nombre lo indica, el java.se módulo agregado hace no incluyen las API de Java EE que se han incluido tradicionalmente con Java 6/7/8.

Afortunadamente, estas API de Java EE que se proporcionaron en JDK 6/7/8 todavía están en el JDK, pero simplemente no están en la ruta de clase de forma predeterminada. Las API de Java EE adicionales 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 de 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 que esto funcione con Java 8!

Si intenta especificar --add-modules con un JDK más antiguo, explotará porque es una opción no reconocida. Sugiero una de dos opciones:

  1. Puede configurar cualquier opción solo de Java 9+ usando el JDK_JAVA_OPTIONS Variable ambiental. Esta variable de entorno es leída automáticamente por el java lanzador para Java 9+.
  2. Puede agregar el -XX:+IgnoreUnrecognizedVMOptions para hacer que la JVM ignore silenciosamente opciones no reconocidas, en lugar de explotar. ¡Pero cuidado! Cualquier otro argumento de línea de comandos que utilice ya no será validado por la JVM. 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 el --add-modules java.se.ee opción. los java.se.ee módulo es un módulo agregado que incluye java.se.ee así como los módulos API de Java EE anteriores. Nota, esto no funciona en Java 11 porque java.se.ee fue eliminado en Java 11.


Solución adecuada a largo plazo: (JDK 9 y posteriores)

Los módulos de la API de Java EE enumerados anteriormente están todos marcados @Deprecated(forRemoval=true) porque están programados para su eliminación en Java 11. Así que el --add-module El enfoque ya no funcionará en Java 11 listo para usar.

Lo que deberá hacer en Java 11 y posteriores es incluir su propia copia de las API de Java EE en la ruta de clase o en la ruta del módulo. Por ejemplo, puede agregar las API de 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 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 posteriores)

Agregue las siguientes dependencias a su build.gradle expediente:

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

En mi caso (jarra de grasa de arranque de primavera) simplemente agrego lo siguiente a pom.xml.

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

Ninguna de estas soluciones funcionó bien para mí en el reciente JDK 9.0.1.

Encontré que esta lista de dependencias es suficiente para un correcto funcionamiento, por lo que no necesito para 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:

<dependencies>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *