Spracovanie NoClassDefFoundError pre JAXBException v Jave 9

1. Úvod

Pre každého, kto sa pokúsil upgradovať na Javu 9, pravdepodobne niečo zažil NoClassDefFoundError pri kompilácii kódu, ktorý predtým fungoval v starších verziách Java.

V tomto článku sa pozrieme na bežnú chýbajúcu triedu, JAXBExceptiona rôznymi spôsobmi, ako to môžeme vyriešiť. Tu uvedené riešenia sú všeobecne použiteľné pre všetky triedy, ktoré môžu chýbať pri aktualizácii na Java 9.

2. Prečo Java 9 nemôže nájsť JAXBException?

Jednou z najdiskutovanejších funkcií Java 9 je modulový systém. Cieľom modulového systému Java 9 je rozdeliť základné triedy JVM a súvisiace projekty na samostatné moduly. To nám pomáha vytvárať aplikácie s menšími stopami tak, že zahrnieme iba minimálne triedy vyžadované na spustenie.

Nevýhodou je, že mnoho tried už v predvolenom nastavení nie je k dispozícii pre triednu cestu. V tomto prípade trieda JAXBExceptionnájdete v jednom z nových pomenovaných modulov Jakarta EE java.xml.bind. Pretože tento modul nevyžaduje základné runtime Java, nie je štandardne k dispozícii na ceste triedy.

Pokúšam sa spustiť aplikáciu, ktorá používa JAXBExceptionbude mať za následok:

NoClassDefFoundError: javax / xml / bind / JAXBException

Aby som to obišiel musíme zahrnúť java.xml.bindmodul. Ako uvidíme ďalej, existuje niekoľko spôsobov, ako to dosiahnuť.

3. Krátkodobé riešenie

Najrýchlejší spôsob, ako sa uistiť, že aplikácie majú k dispozícii triedy JAXB API, je pridať Použi –Pridat moduly argument príkazového riadku:

--add-modules java.xml.bind

To však nemusí byť dobré riešenie z niekoľkých dôvodov.

Po prvé, –Pridat moduly Argument je nový aj v prostredí Java 9. Pre aplikácie, ktoré musia bežať na viacerých verziách Java, to predstavuje určité výzvy. Museli by sme udržiavať viac súborov zostavovacích súborov, jeden pre každú verziu Java, na ktorej je aplikácia spustená.

Na vyriešenie tohto problému by sme mohli použiť aj -XX: + IgnoreUnrecognizedVMOptionsargument príkazového riadku pre staršie kompilátory Java.

To však znamená, že nás nebude informovať o nijakých preklepoch alebo chybne napísaných argumentoch. Napríklad, ak sa pokúsime nastaviť minimálnu alebo maximálnu veľkosť haldy a napíšeme nesprávne názov argumentu, nedostane sa varovanie. Naša aplikácia sa stále spustí, ale bude bežať s inou konfiguráciou, ako sme čakali.

Po druhé, –Pridat moduly Táto podpora bude v budúcom vydaní Java ukončená. To znamená, že v určitom okamihu po inovácii na novú verziu Javy budeme čeliť rovnakému problému s používaním neznámeho argumentu príkazového riadku a budeme sa musieť problémom venovať znova.

4. Dlhodobé riešenie

Existuje lepší prístup, ktorý bude fungovať v rôznych verziách Java a nebude sa lámať s budúcimi vydaniami.

Riešením je využiť nástroj na správu závislostí, napríklad Maven. S týmto prístupom by sme pridali knižnicu JAXB API ako závislosť rovnako ako ktorúkoľvek inú knižnicu:

 javax.xml.bind jaxb-api 2.3.0 

Vyššie uvedená knižnica obsahuje iba triedy JAXB API, ktoré obsahuje JAXBException. V závislosti od aplikácie bude možno potrebné zahrnúť ďalšie moduly.

Nezabudnite tiež, že Názvy artefaktov Maven sa môžu líšiť od názvu modulu Java 9, ako je to v prípade rozhrania JAXB API. Nachádza sa na Maven Central.

5. Záver

Systémový modul Java 9 poskytuje množstvo výhod, ako je zmenšovanie veľkosti aplikácie a lepší výkon.

Prináša však aj určité nezamýšľané dôsledky. Pri aktualizácii na Java 9 je dôležité pochopiť, ktoré moduly aplikácia skutočne vyžaduje, a podniknúť kroky na zabezpečenie ich dostupnosti na ceste triedy.