Jak rozwiązać wyjątek java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException w Java 9

Mam pewien kod, który używa klas JAXB API, które zostały dostarczone jako część JDK w Javie 6/7/8. Kiedy uruchamiam ten sam kod z Java 9, w czasie wykonywania dostaję błędy wskazujące, że nie można znaleźć klas JAXB.

Klasy JAXB są dostarczane jako część JDK od Java 6, więc dlaczego Java 9 nie może już znaleźć tych klas?

Rozwiązanie

API JAXB są uważane za API Java EE, a zatem nie są już zawarte na domyślnej ścieżce klas w Java SE 9. W Java 11 są one całkowicie usunięte z JDK.

Java 9 wprowadza koncepcje modułów, a domyślnie moduł agregujący java.se jest dostępny na ścieżce klas (lub raczej ścieżce modułów). Jak sama nazwa wskazuje, moduł zbiorczy java.se nie zawiera interfejsów API Java EE, które tradycyjnie były dołączane do Javy 6/7/8.

Na szczęście, te API Java EE, które były dostarczane w JDK 6/7/8 są nadal w JDK, ale po prostu nie są domyślnie na ścieżce klas. Dodatkowe interfejsy API Java EE są dostarczane w następujących modułach:


java.activation
java.corba
java.transaction
java.xml.bind  
Komentarze (28)

To zadziałało w moim przypadku:


    javax.xml.bind
    jaxb-api
    2.3.0


    org.eclipse.persistence
    eclipselink
    2.7.0

Aktualizacja

Jak zasugerował @Jasper, aby uniknąć zależności od całej biblioteki EclipseLink, możesz również po prostu zależeć od EclipseLink MOXy:

Maven.


    org.eclipse.persistence
    org.eclipse.persistence.moxy
    2.7.3

Gradle

compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'

Jako zależności dla mojej aplikacji Java 8, która produkuje *.jar, który może być uruchomiony zarówno przez JRE 8 jak i JRE 9 bez dodatkowych argumentów.

Ponadto musi to zostać wykonane gdzieś przed użyciem JAXB API:

System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");

Działa świetnie do tej pory, jako obejście. Nie wygląda to jednak na idealne rozwiązanie...

Komentarze (8)

W czasie kompilacji, jak również w czasie uruchamiania, dodaj przełącznik --add-modules java.xml.bind.

javac --add-modules java.xml.bind 

java --add-modules java.xml.bind 

Dobre wprowadzenie do modułów JDK 9 można również znaleźć na stronie : https://www.youtube.com/watch?v=KZfbRuvv5qc

Komentarze (0)