Miten ratkaista java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException Java 9:ssä?
Minulla on koodia, joka käyttää JAXB API -luokkia, jotka on toimitettu osana JDK:ta Java 6/7/8:ssa. Kun suoritan saman koodin Java 9:llä, saan ajonaikana virheitä, jotka ilmoittavat, että JAXB-luokkia ei löydy.
JAXB-luokkia on tarjottu osana JDK:ta Java 6:sta lähtien, joten miksi Java 9 ei enää löydä näitä luokkia?
718
3
JAXB-rajapintoja pidetään Java EE:n rajapintoina, joten ne eivät enää sisälly oletusluokkapolkuun Java SE 9:ssä. Java 11:ssä ne on poistettu kokonaan JDK:sta.
Java 9:ssä otetaan käyttöön moduulien käsitteet, ja oletusarvoisesti luokkapolulla (tai pikemminkin moduulipolulla) on saatavilla
java.se
-aggregaattimoduuli. Kuten nimestä voi päätellä,java.se
-aggregaattimoduuli ei sisällä Java EE -rajapintoja, jotka on perinteisesti liitetty Java 6/7/8:een.Onneksi nämä JDK 6/7/8:ssa tarjotut Java EE API:t ovat edelleen JDK:ssa, mutta ne eivät vain ole oletusarvoisesti luokkapolulla. Ylimääräiset Java EE API:t ovat seuraavissa moduuleissa:
Tämä toimi minulle:
Päivitys
Kuten @Jasper ehdotti, voit olla riippuvainen koko EclipseLink-kirjastosta, jos haluat välttää riippuvuuden koko EclipseLink-kirjastosta, voit myös olla riippuvainen vain EclipseLink MOXysta:
Maven
Gradle
Riippuvuuksina Java 8 -sovelluksessani, joka tuottaa *.jar-tiedoston, joka voidaan ajaa sekä JRE 8:lla että JRE 9:llä ilman lisäargumentteja.
Lisäksi tämä on suoritettava jossakin ennen JAXB API:n käyttöä:
Toimii toistaiseksi loistavasti, kiertotapana. Ei kuitenkaan näytä täydelliseltä ratkaisulta...
Sekä kääntämisen että ajon aikana lisää kytkin
--add-modules java.xml.bind
.Hyvä esittely
JDK 9
moduuleista löytyy myös osoitteesta : https://www.youtube.com/watch?v=KZfbRuvv5qc