Håndtering av NoClassDefFoundError for JAXBException i Java 9

1. Introduksjon

For alle som har prøvd å oppgradere til Java 9, har de sannsynligvis opplevd en slags NoClassDefFoundError når du kompilerer kode som tidligere fungerte i tidligere versjoner av Java.

I denne artikkelen ser vi på en vanlig manglende klasse, JAXBExceptionog forskjellige måter vi kan løse det på. Løsningene som gis her gjelder generelt for alle klasser som kan mangle når du oppgraderer til Java 9.

2. Hvorfor Java 9 ikke kan finne JAXBException?

En av de mest diskuterte funksjonene i Java 9 er modulsystemet. Målet med Java 9-modulsystemet er å dele kjerne-JVM-klassene og relaterte prosjekter fra hverandre i frittstående moduler. Dette hjelper oss med å lage applikasjoner med mindre fotavtrykk ved å bare inkludere minimumsklassene som skal kjøres.

Ulempen er at mange klasser ikke lenger er tilgjengelige på klassestien som standard. I dette tilfellet klassen JAXBExceptionkan du finne i en av de nye Jakarta EE-modulene som heter java.xml.bind. Siden denne modulen ikke kreves av kjernens Java-kjøretid, er den ikke tilgjengelig på klassestien som standard.

Prøver å kjøre et program som bruker JAXBExceptionvil resultere i:

NoClassDefFoundError: javax / xml / bind / JAXBException

For å komme rundt dette vi må inkludere java.xml.bindmodul. Som vi vil se nedenfor, er det flere måter å oppnå dette på.

3. Kortsiktig løsning

Den raskeste måten å sikre at JAXB API-klassene er tilgjengelige for et program, er å legge til bruke – Legge til moduler kommandolinje argument:

- legge til moduler java.xml.bind

Dette kan imidlertid ikke være en god løsning av et par grunner.

Først, den – Legge til moduler argumentet er også nytt i Java 9. For applikasjoner som trenger å kjøre på flere versjoner av Java, gir dette noen utfordringer. Vi må ha flere sett med build-filer, ett for hver Java-versjon applikasjonen kjører på.

For å omgå dette kan vi også bruke -XX: + Ignorer ukjenteVMOptionskommandolinjeargument for eldre Java-kompilatorer.

Dette betyr imidlertid at enhver skrivefeil eller feilstavet argument ikke blir gjort oppmerksom på oss. For eksempel, hvis vi prøver å angi en minimum eller maksimal haugestørrelse og feil skrive inn argumentnavnet, får vi ingen advarsel. Applikasjonen vår vil fortsatt starte, men den kjører med en annen konfigurasjon enn vi forventer.

For det andre, – Legge til moduler alternativet avvikles i en fremtidig Java-utgivelse. Dette betyr at på et tidspunkt etter at vi har oppgradert til en ny versjon av Java, vil vi møte det samme problemet med å bruke et ukjent kommandolinjeargument og må løse problemet igjen.

4. Langsiktig løsning

Det er en bedre tilnærming som fungerer på tvers av forskjellige versjoner av Java og ikke vil bryte med fremtidige utgivelser.

Løsningen er å bruke et avhengighetsstyringsverktøy som Maven. Med denne tilnærmingen vil vi legge til JAXB API-biblioteket som en avhengighet akkurat som ethvert annet bibliotek:

 javax.xml.bind jaxb-api 2.3.0 

Biblioteket ovenfor inneholder bare JAXB API-klassene, som inkluderer JAXBException. Avhengig av applikasjonen kan det hende vi trenger å inkludere andre moduler.

Husk også at Navnene på Maven-gjenstander kan være forskjellige enn navnet på Java 9-modulen, slik tilfellet er for JAXB API. Den finnes på Maven Central.

5. Konklusjon

Java 9-modulsystemet gir en rekke fordeler som redusert applikasjonsstørrelse og bedre ytelse.

Imidlertid introduserer det også noen utilsiktede konsekvenser. Når du oppgraderer til Java 9, er det viktig å forstå hvilke moduler et program virkelig krever, og ta skritt for å sikre at de er tilgjengelige på klassestien.


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