Więcej
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?
718
3
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ł zbiorczyjava.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:
To zadziałało w moim przypadku:
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.
Gradle
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:
Działa świetnie do tej pory, jako obejście. Nie wygląda to jednak na idealne rozwiązanie...
W czasie kompilacji, jak również w czasie uruchamiania, dodaj przełącznik
--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