Sådan løser du java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException i Java 9
Jeg har noget kode, der bruger JAXB API-klasser, som er blevet leveret som en del af JDK i Java 6/7/8. Når jeg kører den samme kode med Java 9, får jeg ved kørselstid fejl, der angiver, at JAXB-klasser ikke kan findes.
JAXB-klasserne har været en del af JDK'et siden Java 6, så hvorfor kan Java 9 ikke længere finde disse klasser?
718
3
JAXB API'erne betragtes som Java EE API'er og er derfor ikke længere indeholdt i standardklassestien i Java SE 9. I Java 11 er de helt fjernet fra JDK'et.
Java 9 indfører begreberne moduler, og som standard er aggregatmodulet
java.se
tilgængeligt på klassestien (eller rettere modulstien). Som navnet antyder, indeholderjava.se
aggregatmodulet ikke de Java EE API'er, som traditionelt er blevet leveret sammen med Java 6/7/8.Heldigvis findes disse Java EE API'er, som blev leveret i JDK 6/7/8, stadig i JDK'et, men de er bare ikke som standard på klassestien. De ekstra Java EE API'er findes i følgende moduler:
Dette virkede for mig:
Opdatering
Som @Jasper foreslog, kan du for at undgå at være afhængig af hele EclipseLink-biblioteket også bare være afhængig af EclipseLink MOXy:
Maven
Gradle
Som afhængigheder for min Java 8-app, som producerer en *.jar, der kan køres af både JRE 8 og JRE 9 uden yderligere argumenter.
Desuden skal dette udføres et eller andet sted, før JAXB API vil blive brugt:
Virker fint indtil videre, som en workaround. Ser dog ikke ud til at være en perfekt løsning...
På kompileringstidspunktet og på kørselstidspunktet skal du tilføje kontakten ``--add-modules java.xml.bind```
En god introduktion til
JDK 9
-modulerne kan også findes på : https://www.youtube.com/watch?v=KZfbRuvv5qc