JAXBException em Java 2025: como corrigir NoClassDefFoundError

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que o Java grita «NoClassDefFoundError: javax/xml/bind/JAXBException» e o que fazer em 2025?

\n\n

Você 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.

\n\n

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\n

A raiz do problema: Java 9 e o sistema modular

\n\n

Tudo 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).

\n\n

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.

\n\n

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.

\n\n

Cenário: como o problema se apresenta na prática

\n\n

Imagine que você tem uma classe simples para trabalhar com 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 saída\n    }\n}
\n\n

Você 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\n
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException\n    at XmlProcessor.convertToXml(XmlProcessor.java:6)\n    ...
\n\n

Familiar? Agora vamos resolver.

\n\n

Método 1: Adicione a API JAXB como dependência externa (recomendado)

\n\n

A 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\n

Para Maven (pom.xml)

\n\n

Adicione em <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

Observe: 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

Blogs

Book Recommendations