Hvordan løse java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException i Java 9

Jeg har noe kode som bruker JAXB API-klasser som er levert som en del av JDK i Java 6/7/8. Når jeg kjører den samme koden med Java 9, får jeg ved kjøretid feil som indikerer at JAXB-klasser ikke kan bli funnet.

JAXB-klassene har vært levert som en del av JDK siden Java 6, så hvorfor kan ikke Java 9 lenger finne disse klassene?

Løsning

JAXB-API-ene betraktes som Java EE-API-er, og finnes derfor ikke lenger i standardklassestien i Java SE 9. I Java 11 er de helt fjernet fra JDK.

Java 9 introduserer begrepene moduler, og som standard er aggregatmodulen java.se tilgjengelig på klassebanen (eller rettere sagt modulbanen). Som navnet tilsier, inneholder ikke aggregatmodulen java.se de Java EE API-ene som tradisjonelt har vært inkludert i Java 6/7/8.

Heldigvis er disse Java EE API-ene som ble levert i JDK 6/7/8 fortsatt i JDK, men de er bare ikke på klassestien som standard. De ekstra Java EE API-ene finnes i følgende moduler:


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

Dette fungerte for meg:


    javax.xml.bind
    jaxb-api
    2.3.0


    org.eclipse.persistence
    eclipselink
    2.7.0

Oppdatering

Som @Jasper foreslo, for å unngå å være avhengig av hele EclipseLink-biblioteket, kan du også bare være avhengig av EclipseLink MOXy:

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'

Som avhengigheter for Java 8-appen min, som produserer en *.jar som kan kjøres av både JRE 8 eller JRE 9 uten ytterligere argumenter.

I tillegg må dette kjøres et sted før JAXB API vil bli brukt:

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

Fungerer bra så langt, som en midlertidig løsning. Ser imidlertid ikke ut som en perfekt løsning ...

Kommentarer (8)

På kompileringstidspunktet samt kjøretid, legg til bryteren --add-modules java.xml.bind.

javac --add-modules java.xml.bind 

java --add-modules java.xml.bind 

En god introduksjon av JDK 9-modulene finnes også på: https://www.youtube.com/watch?v=KZfbRuvv5qc

Kommentarer (0)