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?
718
3
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 aggregatmodulenjava.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:
Dette fungerte for meg:
Oppdatering
Som @Jasper foreslo, for å unngå å være avhengig av hele EclipseLink-biblioteket, kan du også bare være avhengig av EclipseLink MOXy:
Maven
Gradle
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:
Fungerer bra så langt, som en midlertidig løsning. Ser imidlertid ikke ut som en perfekt løsning ...
På kompileringstidspunktet samt kjøretid, legg til bryteren
--add-modules java.xml.bind
.En god introduksjon av
JDK 9
-modulene finnes også på: https://www.youtube.com/watch?v=KZfbRuvv5qc