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?

Ratkaisu

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:


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

Tämä toimi minulle:


    javax.xml.bind
    jaxb-api
    2.3.0


    org.eclipse.persistence
    eclipselink
    2.7.0

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


    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'

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öä:

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

Toimii toistaiseksi loistavasti, kiertotapana. Ei kuitenkaan näytä täydelliseltä ratkaisulta...

Kommentit (8)

Sekä kääntämisen että ajon aikana lisää kytkin --add-modules java.xml.bind.

javac --add-modules java.xml.bind 

java --add-modules java.xml.bind 

Hyvä esittely JDK 9 moduuleista löytyy myös osoitteesta : https://www.youtube.com/watch?v=KZfbRuvv5qc

Kommentit (0)