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?
718
3
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:
Bu bende işe yaradı:
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
Gradle
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:
Geçici bir çözüm olarak şimdiye kadar harika çalışıyor. Yine de mükemmel bir çözüm gibi görünmüyor...
Derleme sırasında ve çalışma zamanında,
--add-modules java.xml.bind
anahtarını ekleyinJDK 9
modüllerinin iyi bir tanıtımı da şu adreste bulunabilir: https://www.youtube.com/watch?v=KZfbRuvv5qc