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?

Løsning

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, indeholder java.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:


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

Dette virkede for mig:


    javax.xml.bind
    jaxb-api
    2.3.0


    org.eclipse.persistence
    eclipselink
    2.7.0

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


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

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

Virker fint indtil videre, som en workaround. Ser dog ikke ud til at være en perfekt løsning...

Kommentarer (8)

På kompileringstidspunktet og på kørselstidspunktet skal du tilføje kontakten ``--add-modules java.xml.bind```

javac --add-modules java.xml.bind 

java --add-modules java.xml.bind 

En god introduktion til JDK 9-modulerne kan også findes på : https://www.youtube.com/watch?v=KZfbRuvv5qc

Kommentarer (0)