A NoClassDefFoundError kezelése a JAXBException számára a Java 9-ben

1. Bemutatkozás

Aki megpróbálta frissíteni a Java 9-et, valószínűleg valamiféle tapasztalatot tapasztalt NoClassDefFoundError a Java korábbi verzióiban korábban működő kód összeállításakor.

Ebben a cikkben egy közös hiányzó osztályt fogunk megvizsgálni, JAXBException, és különböző módon tudjuk megoldani. Az itt megadott megoldások általában minden olyan osztályra alkalmazhatók, amely hiányozhat a Java 9-re történő frissítéskor.

2. Miért nem található meg a Java 9? JAXBException?

A Java 9 egyik legvitatottabb jellemzője a modulrendszer. A Java 9 modulrendszer célja, hogy a JVM alaposztályokat és a kapcsolódó projekteket önálló modulokká bontsa szét. Ez segít abban, hogy kisebb lábnyomokkal rendelkező alkalmazásokat hozzunk létre, mivel csak a futtatáshoz szükséges minimális osztályokat tartalmazza.

Hátránya, hogy sok osztály alapértelmezés szerint már nem elérhető az osztályúton. Ebben az esetben az osztály JAXBExceptiona Jakarta EE nevű új modulok egyikében található java.xml.bind. Mivel a Java Java futásideje nem írja elő ezt a modult, alapértelmezés szerint nem elérhető az osztályúton.

Olyan alkalmazást próbál futtatni, amely használja JAXBExceptioneredményez:

NoClassDefFoundError: javax / xml / bind / JAXBException

Ezt megkerülni bele kell foglalnunk a java.xml.bindmodul. Amint alább láthatjuk, ennek többféle módja van.

3. Rövid távú megoldás

A hozzáadással a JAXB API osztályok elérhetőségének leggyorsabb módja az alkalmazás használja a –Add-modulok parancssori argumentum:

--add-modules java.xml.bind

Ez azonban néhány okból nem biztos, hogy jó megoldás.

Először is a –Add-modulok Az argumentum a Java 9-ben is új. Azoknak az alkalmazásoknak, amelyeknek a Java több változatán kell futniuk, ez néhány kihívást jelent. Több összeállítási fájlt kell fenntartanunk, egy-egy minden Java-verzióhoz, amelyen az alkalmazás fut.

Ennek kiküszöbölésére a -XX: + IgnoreUnrecognizedVMOptionsparancssori argumentum a régebbi Java fordítókhoz.

Ez azonban azt jelenti, hogy az esetleges elírási hibákat vagy elgépelt érveket nem hívják fel a figyelmünkre. Például, ha megpróbálunk beállítani egy minimális vagy maximális kupacméretet és hibásan beírni az argumentum nevét, akkor nem kapunk figyelmeztetést. Az alkalmazásunk továbbra is elindul, de más konfigurációval fog futni, mint amire számítottunk.

Másodszor, a –Add-modulok opció megszűnik egy jövőbeli Java kiadásban. Ez azt jelenti, hogy egy bizonyos ponton a Java új verziójára való frissítés után ugyanazzal a problémával kell szembenéznünk, ha ismeretlen parancssori argumentumot használunk, és újra meg kell oldanunk a problémát.

4. Hosszú távú megoldás

Van egy jobb megközelítés, amely a Java különböző verzióiban működik, és nem szakad meg a jövőbeni kiadásokkal.

A megoldás az használjon egy függőségkezelő eszközt, mint például a Maven. Ezzel a megközelítéssel hozzáadnánk a JAXB API könyvtárat függőségként, mint bármely más könyvtárat:

 javax.xml.bind jaxb-api 2.3.0 

A fenti könyvtár csak a JAXB API osztályokat tartalmazza, beleértve a következőket: JAXBException. Az alkalmazástól függően szükség lehet más modulok beépítésére.

Ne feledje azt sem, hogy a A Maven műterméknevek eltérhetnek a Java 9 modul nevétől, mint a JAXB API esetében. Megtalálható a Maven Central oldalon.

5. Következtetés

A Java 9 modulrendszer számos előnnyel jár, például az alkalmazás méretének csökkenése és a jobb teljesítmény.

Ugyanakkor néhány nem szándékos következményt is bevezet. Java 9-re történő frissítéskor fontos megérteni, hogy mely alkalmazásokra van szükség egy alkalmazáshoz, és tegyen lépéseket annak biztosítására, hogy elérhetőek legyenek az osztályúton.


$config[zx-auto] not found$config[zx-overlay] not found