Java 9'da java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException nasıl çözülür

Java 6/7/8'de JDK'nın bir parçası olarak sağlanan JAXB API sınıflarını kullanan bazı kodlarım var. Aynı kodu Java 9 ile çalıştırdığımda, çalışma zamanında JAXB sınıflarının bulunamadığını belirten hatalar alıyorum.

JAXB sınıfları Java 6'dan beri JDK'nın bir parçası olarak sağlanmıştır, peki Java 9 neden artık bu sınıfları bulamıyor?

Çözüm

JAXB API'leri Java EE API'leri olarak kabul edilir ve bu nedenle Java SE 9'da artık varsayılan sınıf yolunda yer almaz. Java 11'de JDK'dan tamamen kaldırılırlar.

Java 9 modül kavramını getirmiştir ve varsayılan olarak java.se aggregate modülü sınıf yolunda (ya da daha doğrusu modül yolunda) mevcuttur. Adından da anlaşılacağı gibi, java.se aggregate modülü, geleneksel olarak Java 6/7/8 ile birlikte gelen Java EE API'lerini içermez.

Neyse ki, JDK 6/7/8'de sağlanan bu Java EE API'leri hala JDK'da, ancak varsayılan olarak sınıf yolunda değiller. Ekstra Java EE API'leri aşağıdaki modüllerde sağlanır:


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

Bu bende işe yaradı:


    javax.xml.bind
    jaxb-api
    2.3.0


    org.eclipse.persistence
    eclipselink
    2.7.0

Güncelleme

Jasper'ın önerdiği gibi, tüm EclipseLink kütüphanesine bağlı kalmamak için, sadece EclipseLink MOXy'ye de bağlı kalabilirsiniz:

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'

Java 8 uygulamam için bağımlılıklar olarak, ek argüman olmadan hem JRE 8 hem de JRE 9 tarafından çalıştırılabilen bir *.jar üretir.

Ayrıca, JAXB API kullanılmadan önce bunun bir yerde çalıştırılması gerekir:

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

Geçici bir çözüm olarak şimdiye kadar harika çalışıyor. Yine de mükemmel bir çözüm gibi görünmüyor...

Yorumlar (8)

Derleme sırasında ve çalışma zamanında, --add-modules java.xml.bind anahtarını ekleyin

javac --add-modules java.xml.bind 

java --add-modules java.xml.bind 

JDK 9 modüllerinin iyi bir tanıtımı da şu adreste bulunabilir: https://www.youtube.com/watch?v=KZfbRuvv5qc

Yorumlar (0)