Rukovanje NoClassDefFoundError za JAXBException u Javi 9

1. Uvod

Za svakoga tko je pokušao nadograditi na Javu 9, vjerojatno je iskusio neku vrstu NoClassDefFoundError prilikom sastavljanja koda koji je prethodno radio u ranijim verzijama Jave.

U ovom ćemo članku pogledati uobičajeni predmet koji nedostaje, JAXBException, i različite načine na koje to možemo riješiti. Ovdje navedena rješenja općenito su primjenjiva na bilo koju klasu koja može nedostajati prilikom nadogradnje na Javu 9.

2. Zašto Java 9 ne može pronaći JAXBException?

Jedna od najvažnijih značajki Java 9 je sustav modula. Cilj sustava Java 9 modula je razdvojiti osnovne JVM klase i povezane projekte na samostalne module. To nam pomaže stvoriti aplikacije s manjim otiscima tako što uključuje samo minimalno potrebne klase za pokretanje.

Loša strana je što mnogi razredi prema zadanim postavkama više nisu dostupni na putu predavanja. U ovom slučaju razred JAXBExceptionmožete pronaći u jednom od novih nazvanih Jakarta EE modula java.xml.bind. Budući da jezgro Java runtime ovog modula ne zahtijeva, prema zadanim postavkama nije dostupan na stazi razreda.

Pokušavam pokrenuti aplikaciju koja koristi JAXBExceptionrezultirat će:

NoClassDefFoundError: javax / xml / bind / JAXBException

Da se ovo zaobiđe moramo uključiti java.xml.bindmodul. Kao što ćemo vidjeti u nastavku, postoji više načina da se to postigne.

3. Kratkoročno rješenje

Najbrži način da osigurate da su JAXB API klase dostupne aplikaciji je dodavanje koristiti –Add-moduli argument naredbenog retka:

--add-moduli java.xml.bind

Međutim, ovo možda nije dobro rješenje iz nekoliko razloga.

Prvo, –Add-moduli Argument je također nov u Javi 9. Za programe koji se trebaju izvoditi na više verzija Jave, ovo predstavlja neke izazove. Morali bismo održavati više skupova datoteka gradnje, po jedan za svaku Java verziju na kojoj aplikacija radi.

Da bismo to zaobišli, mogli bismo koristiti i -XX: + IgnoreUncoconizedVMOptionsargument naredbenog retka za starije Java kompajlere.

Međutim, to znači da nam neće biti skrenuta pažnja na bilo koju pogrešku pri upisu ili pogrešno napisane riječi. Na primjer, ako pokušamo postaviti minimalnu ili maksimalnu veličinu hrpe i pogrešno upišemo ime argumenta, nećemo dobiti upozorenje. Naša će se aplikacija i dalje pokretati, ali pokrenut će se s drugačijom konfiguracijom nego što očekujemo.

Drugo, –Add-moduli opcija zastarjet će u budućem izdanju Jave. To znači da ćemo se u nekom trenutku nakon nadogradnje na novu verziju Jave suočiti s istim problemom upotrebe nepoznatog argumenta naredbenog retka i problem ćemo morati ponovno riješiti.

4. Dugoročno rješenje

Postoji bolji pristup koji će raditi u različitim verzijama Jave i neće prekinuti buduća izdanja.

Rješenje je u koristiti alat za upravljanje ovisnostima kao što je Maven. Ovim pristupom dodali bismo JAXB API knjižnicu kao ovisnost baš kao i bilo koja druga knjižnica:

 javax.xml.bind jaxb-api 2.3.0 

Gornja knjižnica sadrži samo JAXB API klase, što uključuje JAXBException. Ovisno o aplikaciji, možda ćemo trebati uključiti i druge module.

Također imajte na umu da Nazivi artefakata Maven mogu se razlikovati od naziva modula Java 9, kao što je slučaj za JAXB API. Može se naći na Maven Central.

5. Zaključak

Sustav modula Java 9 pruža brojne pogodnosti poput smanjenja veličine aplikacije i boljih performansi.

Međutim, to također donosi neke neželjene posljedice. Pri nadogradnji na Javu 9 važno je razumjeti koje module aplikacija uistinu zahtijeva i poduzeti korake kako bi se osiguralo da su dostupni na putu predavanja.