Por que o Java grita «NoClassDefFoundError: javax/xml/bind/JAXBException» e o que fazer em 2025?
\n\nVocê já se deparou com uma situação em que sua aplicação Java, que ontem funcionava perfeitamente, hoje falha com o erro assustador java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException? Se sim — você não está sozinho. Esta questão acumulou milhares de visualizações no Stack Overflow, e a demanda por uma solução não diminui nem em 2025. O problema está relacionado a mudanças fundamentais no ecossistema Java que ocorreram há alguns anos, mas ainda afetam os desenvolvedores.
Neste artigo, não vamos apenas dar a "solução pronta" — vamos analisar por que esse erro ocorre e mostrar três maneiras confiáveis de corrigi-lo. Você aprenderá como configurar corretamente Maven, Gradle ou argumentos JVM para que sua aplicação volte a funcionar. Vamos lá!
\n\nA raiz do problema: Java 9 e o sistema modular
\n\nTudo começou com o Java 9 (lançado em 2017). Nesta versão, a Oracle introduziu o sistema modular (Project Jigsaw). Muitos pacotes que antes faziam parte da biblioteca padrão (JDK) foram movidos para módulos separados ou removidos completamente. Um desses "excluídos" foi o pacote javax.xml.bind (JAXB — Java Architecture for XML Binding).
No Java 8 e versões anteriores, o JAXB estava disponível "de fábrica". A partir do Java 9, ele se tornou opcional. E no Java 11, foi completamente removido do JDK. Se você escreve código que usa javax.xml.bind.JAXBContext, JAXBException ou Marshaller e o executa no Java 11+, você certamente receberá um NoClassDefFoundError.
Importante: NoClassDefFoundError é diferente de ClassNotFoundException. O primeiro ocorre quando a classe estava disponível na fase de compilação, mas desapareceu durante a execução. O segundo — quando a classe não é encontrada de forma alguma.
Cenário: como o problema se apresenta na prática
\n\nImagine que você tem uma classe simples para trabalhar com 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 saída\n }\n}\n\nVocê compila este código no Java 8 — tudo ok. Em seguida, você atualiza o JDK para a versão 11 ou 17, executa a aplicação e vê:
\n\nException in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException\n at XmlProcessor.convertToXml(XmlProcessor.java:6)\n ...\n\nFamiliar? Agora vamos resolver.
\n\nMétodo 1: Adicione a API JAXB como dependência externa (recomendado)
\n\nA abordagem mais correta e moderna é declarar explicitamente que sua aplicação usa JAXB. Para isso, você precisa adicionar a biblioteca através do sistema de build (Maven ou Gradle).
\n\nPara Maven (pom.xml)
\n\nAdicione em <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\nObserve: a partir do Jakarta EE 9 (junho de 2021), o pacote javax.xml.bind foi renomeado para jakarta.xml.bind. Se seu código é antigo e usa javax.*, você ainda pode usar