Tags: Java

Java: Jak rozwiązać java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException?

Błąd `java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException` często pojawia się w aplikacjach Java, szczególnie po migracji do Java 9 lub nowszej. Wynika to z faktu, że pakiet JAXB (Java Architecture for XML Binding) został usunięty z JDK od wersji Java 9. Oto kilka kroków, które można podjąć, aby rozwiązać ten problem:

Dodaj Zależności JAXB

Jeśli używasz Mavena, dodaj następujące zależności do pliku `pom.xml`:


<!-- JAXB API --&gp;
<dependency&gp;
    <groupId&gp;javax.xml.bind</groupId&gp;
    <artifactId&gp;jaxb-api</artifactId&gp;
    <version&gp;2.3.1</version&gp;
</dependency&gp;</p&gp;
<p&gp;<!-- JAXB Runtime --&gp;
<dependency&gp;
    <groupId&gp;org.glassfish.jaxb</groupId&gp;
    <artifactId&gp;jaxb-runtime</artifactId&gp;
    <version&gp;2.3.1</version&gp;
</dependency&gp;</p&gp;
<p&gp;<!-- Activation --&gp;
<dependency&gp;
    <groupId&gp;javax.activation</groupId&gp;
    <artifactId&gp;activation</artifactId&gp;
    <version&gp;1.1.1</version&gp;
</dependency&gp;

Dla Gradle, dodaj w `build.gradle`:


implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.1'
implementation 'javax.activation:activation:1.1.1'

Moduły Java

Jeśli używasz modułów Java (Java 9+), musisz wymagać odpowiednich modułów w swoim `module-info.java`:


module nazwa.twojego.modulu {
    requires java.xml.bind;
}

Alternatywne Rozwiązania

  • **Downgrade JDK**: Jeśli nie musisz używać Java 9+, możesz wrócić do Java 8, gdzie JAXB jest wciąż dostępny w standardowym JDK.
  • **Użyj innej implementacji JAXB**: Istnieją alternatywne implementacje JAXB, które mogą być użyte zamiast domyślnego pakietu Java.
  • **Użyj innej technologii**: Rozważ użycie innych technologii do obsługi XML, takich jak Jackson, XStream, itp., jeśli JAXB nie jest konieczny dla Twojego projektu.

Użycia JAXB

Oto prosty przykład, jak używać JAXB:


import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;</p&gp;
<p&gp;public class JAXBExample {
    public static void main(String[] args) {
        try {
            JAXBContext context = JAXBContext.newInstance(MyClass.class);</p&gp;
<p&gp;MyClass obj = new MyClass();
            // Ustaw wartości obj</p&gp;
<p&gp;// Marshalling - konwersja obiektu na XML
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.marshal(obj, System.out);</p&gp;
<p&gp;// Unmarshalling - konwersja XML na obiekt
            // ... analogicznie jak wyżej
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

Pamiętaj, że te kroki mogą się różnić w zależności od specyfikacji projektu i używanych narzędzi. Ważne jest, aby dostosować te rozwiązania do swojego środowiska pracy.