JAXBException en Java 2025: cómo corregir NoClassDefFoundError

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué Java grita «NoClassDefFoundError: javax/xml/bind/JAXBException» y qué hacer al respecto en 2025?

\n\n

¿Alguna vez te has encontrado con una situación en la que tu aplicación Java, que ayer funcionaba como un reloj, hoy falla con el aterrador error java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException? Si es así, no estás solo. Esta pregunta ha acumulado miles de visitas en Stack Overflow, y la demanda de una solución no disminuye ni siquiera en 2025. El problema está relacionado con cambios fundamentales en el ecosistema de Java que ocurrieron hace varios años, pero que todavía afectan a los desarrolladores.

\n\n

En este artículo no solo te daremos «la solución hecha»: analizaremos por qué ocurre este error y te mostraremos tres formas fiables de corregirlo. Aprenderás cómo configurar correctamente Maven, Gradle o los argumentos de la JVM para que tu aplicación vuelva a funcionar. ¡Allá vamos!

\n\n

La raíz del mal: Java 9 y el sistema modular

\n\n

Todo comenzó con Java 9 (lanzado en 2017). En esta versión, Oracle implementó el sistema modular (Project Jigsaw). Muchos paquetes que antes formaban parte de la biblioteca estándar (JDK) se movieron a módulos separados o se eliminaron por completo. Uno de estos «exiliados» fue el paquete javax.xml.bind (JAXB — Java Architecture for XML Binding).

\n\n

En Java 8 y versiones anteriores, JAXB estaba disponible «de serie». A partir de Java 9, se volvió opcional. Y en Java 11 se eliminó por completo del JDK. Si escribes código que usa javax.xml.bind.JAXBContext, JAXBException o Marshaller, y lo ejecutas en Java 11+, obtendrás garantizado el NoClassDefFoundError.

\n\n

Importante: NoClassDefFoundError es diferente de ClassNotFoundException. El primero ocurre cuando la clase estaba disponible en tiempo de compilación, pero desapareció durante la ejecución. El segundo, cuando la clase no se encuentra en absoluto.

\n\n

Escenario: cómo se ve el problema en la práctica

\n\n

Imagina que tienes una clase simple para trabajar con XML:

\n\n
import javax.xml.bind.JAXBContext;\nimport javax.xml.bind.JAXBException;\nimport javax.xml.bind.Marshaller;\n\npublic class XmlProcessor {\n\n    public void convertToXml(Object obj) throws JAXBException {\n        JAXBContext context = JAXBContext.newInstance(obj.getClass());\n        Marshaller marshaller = context.createMarshaller();\n        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);\n        // ... lógica de salida\n    }\n}
\n\n

Compilas este código en Java 8 — todo bien. Luego actualizas el JDK a la versión 11 o 17, ejecutas la aplicación y ves:

\n\n
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException\n    at XmlProcessor.convertToXml(XmlProcessor.java:6)\n    ...
\n\n

¿Te suena familiar? Ahora vamos a solucionarlo.

\n\n

Forma 1: Agregar la API JAXB como dependencia externa (recomendada)

\n\n

El enfoque más correcto y moderno es indicar explícitamente que tu aplicación usa JAXB. Para ello, debes agregar la biblioteca a través del sistema de compilación (Maven o Gradle).

\n\n

Para Maven (pom.xml)

\n\n

Agrega en <dependencies>:

\n\n
<dependency>\n    <groupId>jakarta.xml.bind</groupId>\n    <artifactId>jakarta.xml.bind-api</artifactId>\n    <version>4.0.2</version>\n</dependency>\n<dependency>\n    <groupId>org.glassfish.jaxb</groupId>\n    <artifactId>jaxb-runtime</artifactId>\n    <version>4.0.5</version>\n    <scope>runtime</scope>\n</dependency>
\n\n

Ten en cuenta: a partir de Jakarta EE 9 (junio de 2021), el paquete javax.xml.bind pasó a llamarse jakarta.xml.bind. Si tu código es antiguo y usa javax.*, aún puedes usar

Blogs

Book Recommendations