Kaip išspręsti java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9

Turiu tam tikrą kodą, kuriame naudojamos JAXB API klasės, pateiktos kaip "Java 6/7/8" JDK dalis. Kai paleidžiu tą patį kodą su "Java 9", paleidimo metu gaunamos klaidos, rodančios, kad JAXB klasių negalima rasti.

JAXB klasės kaip JDK dalis teikiamos nuo "Java 6", tad kodėl "Java 9" nebegali rasti šių klasių?

Sprendimas

JAXB API laikomos "Java EE" API, todėl "Java SE 9" jos nebėra numatytojo klasių kelio sąraše. "Java 11" jos visiškai pašalintos iš JDK.

Java 9 įvestos modulių sąvokos, ir pagal nutylėjimą klasės kelyje (tiksliau, modulių kelyje) yra java.se suvestinis modulis. Kaip matyti iš pavadinimo, java.se agreguotasis modulis neapima Java EE API, kurios tradiciškai buvo pridedamos prie Java 6/7/8.

Laimei, šios Java EE API, kurios buvo pateiktos JDK 6/7/8, vis dar yra JDK, bet jų tiesiog'nėra klasių kelyje pagal nutylėjimą. Papildomos "Java EE" API pateikiamos šiuose moduliuose:


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

Man tai padėjo:


    javax.xml.bind
    jaxb-api
    2.3.0


    org.eclipse.persistence
    eclipselink
    2.7.0

Atnaujinti

Kaip siūlė @Jasper, kad nereikėtų priklausyti nuo visos "EclipseLink" bibliotekos, taip pat galite priklausyti tik nuo "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'

Kaip priklausomybės mano "Java 8" programai, kuri sukuria *.jar, kurį galima paleisti tiek su JRE 8, tiek su JRE 9 be jokių papildomų argumentų.

Be to, prieš pradedant naudoti JAXB API, ją reikia kažkur paleisti:

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

Kol kas veikia puikiai, kaip apeinamasis variantas. Tačiau tai neatrodo tobulas sprendimas...

Komentarai (8)

Kompiliavimo ir vykdymo metu pridėkite jungiklį --add-modules java.xml.bind

javac --add-modules java.xml.bind 

java --add-modules java.xml.bind 

Gerą JDK 9 modulių įvadą taip pat galima rasti adresu : https://www.youtube.com/watch?v=KZfbRuvv5qc

Komentarai (0)