¿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.
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\nLa raíz del mal: Java 9 y el sistema modular
\n\nTodo 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).
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.
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.
Escenario: cómo se ve el problema en la práctica
\n\nImagina que tienes una clase simple para trabajar con XML:
\n\nimport 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\nCompilas 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\nException 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\nForma 1: Agregar la API JAXB como dependencia externa (recomendada)
\n\nEl 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\nPara Maven (pom.xml)
\n\nAgrega en <dependencies>:
<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\nTen 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