A java.lang.UnsupportedClassVersionError javítása

1. Bemutatkozás

Ebben a rövid bemutatóban megtudjuk, mi okozza a Java futásidejű hibát java.lang.UnsupportedClassVersionError: Nem támogatott major.minor verzió és hogyan lehet kijavítani.

2. Nézd meg a hibát

Kezdjük egy hibapéldával:

Kivétel a "main" szálban java.lang.UnsupportedClassVersionError: com / baeldung / MajorMinorApp a Java Runtime újabb verziójával (osztályfájl 55.0 verziója) állította össze, a Java Runtime ezen verziója csak 52.0-ig ismeri fel az osztályfájlokat

Ez a hiba arról árulkodik, hogy az osztályunkat a Java magasabb verziójával állítottuk össze, mint azt a verziót, amellyel megpróbáltuk futtatni. Pontosabban ebben az esetben ebben az esetben Java 11-gyel állítottuk össze az osztályunkat, és megpróbáltuk Java 8-val futtatni.

2.1. Java verziószámok

Referenciaként vessünk egy gyors pillantást a Java verziószámokra. Ez hasznos lesz abban az esetben, ha le kell töltenünk a megfelelő Java verziót.

A nagyobb és a kisebb verziószámokat az osztály bájtkódjában tárolják a hat és a hét bájton.

Lássuk, hogyan kapcsolódnak a fő verziószámok a Java verziókhoz:

  • 45 = Java 1.1
  • 46 = Java 1.2
  • 47 = Java 1.3
  • 48 = Java 1.4
  • 49 = Java 5
  • 50 = Java 6
  • 51 = Java 7
  • 52 = Java 8
  • 53 = Java 9
  • 54 = Java 10
  • 55 = Java 11
  • 56 = Java 12
  • 57 = Java 13

3. Javítás a parancssoron keresztül

Most beszéljük meg, hogyan oldhatjuk meg ezt a hibát a Java parancssorból történő futtatásakor.

A helyzetünktől függően kétféleképpen oldhatjuk meg ezt a hibát: fordítsuk le a kódunkat a Java korábbi verziójára, vagy futtassuk a kódunkat egy újabb Java verzióra.

A végső döntés a helyzetünkön múlik. Ha harmadik féltől származó, már magasabb szinten lefordított könyvtárat kell használnunk, akkor a legjobb megoldás valószínűleg az, hogy alkalmazásunkat egy újabb Java verzióval futtatjuk. Ha egy alkalmazást csomagolunk terjesztés céljából, akkor a legjobb, ha lefordítunk egy régebbi verzióra.

3.1. JAVA_HOME Környezeti változó

Kezdjük azzal, hogy ellenőrizzük, hogyan JAVA_HOME változó be van állítva. Ez megmondja, hogy melyik JDK-t használjuk, amikor futunk javac parancssorunkból:

echo% JAVA_HOME% C: \ Apps \ Java \ jdk8-x64

Ha készen állunk arra, hogy teljes mértékben áttérjünk egy újabb JDK-ra, letölthetjük az újabb verziót, és megbizonyosodhatunk róla PÁLYA és JAVA_HOME a környezeti változókat megfelelően állítják be.

3.2. Új JRE futtatása

Visszatérve a példánkra, nézzük meg, hogyan oldhatjuk meg a hibát a Java magasabb verziójának futtatásával. Tételezzük fel, hogy a Java 11 JRE van bennünk C: \ Apps \ jdk-11.0.2, futtathatjuk a kódunkat a Jáva parancs csomagolva:

C: \ Apps \ jdk-11.0.2 \ bin \ java com.baeldung.MajorMinorApp Hello World!

3.3. Összeállítás egy idősebb JDK-val

Ha olyan alkalmazást írunk, amelyet le akarunk futtatni a Java bizonyos verzióira, össze kell állítanunk az adott verzió kódját.

Háromféleképpen tehetjük meg: egy régebbi JDK használatával állítsuk össze kódunkat, a -bootclasspath, -forrás, és -cél lehetőségei javac parancsot (JDK 8 és régebbi), vagy a -kiadás opció (JDK 9 és újabb).

Kezdjük egy régebbi JDK használatával, hasonlóan ahhoz, ahogyan egy újabb JRE-t használtunk a kódunk futtatásához:

C: \ Apps \ Java \ jdk1.8.0_31 \ bin \ javac com / baeldung / MajorMinorApp.java

Lehetséges csak használni -forrás és -cél, de előfordulhat, hogy olyan osztályfájlokat hoz létre, amelyek nem kompatibilisek egy régebbi Java-val.

A kompatibilitás biztosítása érdekében tudunk mutatni -bootclasspath a rt.jar a megcélzott JRE:

javac -bootclasspath "C: \ Apps \ Java \ jdk1.8.0_31 \ jre \ lib \ rt.jar" \ -forrás 1.8 -target 1.8 com / baeldung / MajorMinorApp.java

A fentiek főként a 8-as és annál alacsonyabb JDK-ra vonatkoznak. A JDK 9-ben a -kiadás paraméter hozzáadva a helyettesítéshez -forrás és -cél. A -kiadás opció támogatja a 6., 7., 8., 9., 10. és 11. célt.

Használjuk -kiadás Java 8 megcélzásához:

javac --release 8 com / baeldung / MajorMinorApp.java

Most futtathatjuk kódunkat Java 8 vagy újabb JRE-n.

4. Eclipse IDE

Most, hogy megértettük a hibát és a kijavítás általános megközelítését, vegyük át a tanultakat, és nézzük meg, hogyan alkalmazhatjuk azt, amikor az Eclipse IDE programban dolgozunk.

4.1. A JRE megváltoztatása

Feltéve, hogy az Eclipse-t már a Java különböző verzióival konfiguráltuk, változtassuk meg projektünk JRE-jét.

Menjünk a miénkre Projekt tulajdonságai, majd a Java építési útvonal, majd a Könyvtárak fülre. Ha odaérünk, kiválasztjuk a JRE-t és kattintunk Szerkesztés:

Most válasszunk Alternatív JRE és mutasson rá a Java 11 telepítésünkre:

Ezen a ponton az alkalmazásunk a Java 11 ellen fut.

4.2. A fordító szintjének módosítása

Most nézzük meg, hogyan változtathatjuk meg célpontunkat alacsonyabb Java szintre.

Először térjünk vissza a miénkre Projekt tulajdonságai, azután Java fordító, és ellenőrizze Projektspecifikus beállítások engedélyezése:

Itt beállíthatjuk, hogy projektünk a Java korábbi verzióihoz fordítson, és testre szabhassuk az egyéb megfelelőségi beállításokat:

5. IntelliJ ÖTLET

Vezérelhetjük a Java verzióját is, amelyet az IntelliJ IDEA fordításához és futtatásához használunk.

5.1. JDK hozzáadása

Mielőtt ezt megtennénk, meglátjuk, hogyan adhatunk hozzá további JDK-kat. Menjünk-hoz Fájl -> Projektszerkezet -> Platformbeállítások -> SDK-k:

Kattintson a plusz ikonra a középső oszlopban, válassza ki a ikont JDK a legördülő menüből, és válassza ki a JDK helyét:

5.2. A JRE megváltoztatása

Először megvizsgáljuk, hogyan lehet az IDEA segítségével futtatni a projektünket az újabb JRE-n.

Menjünk-hoz Futtatás -> Konfigurációk szerkesztése… és változtasson a mi JRE 11-ig:

Most, amikor futtatjuk a projektünket, a Java 11 JRE-vel fog futni.

5.3. A fordító szintjének módosítása

Ha az alkalmazásunkat alacsonyabb JRE-re futtatjuk, akkor a fordító szintjét úgy kell beállítanunk, hogy a Java régebbi verzióját célozzuk meg.

Menjünk-hoz Fájl -> Projektszerkezet ... -> Projektbeállítások -> Projekt és változtasson a mi Projekt SDK és Projekt nyelvi szint:

Most elkészíthetjük a projektünket, és a létrehozott osztályfájlok Java 8 és újabb verziókon fognak futni.

6. Maven

Amikor egy fájlt építünk és csomagolunk a Maven-ben, vezérelhetjük a Java által megcélzott verziót.

Java 8 vagy annál régebbi verzióknál a fordító plugin forrását és célját állítjuk be.

Állítsuk be a forrást és a célt a fordító beépülő modul tulajdonságainak felhasználásával:

 1.8 1.8 

Alternatív megoldásként beállíthatjuk a forrást és a célt a fordító beépülő moduljában:

  maven-compiler-plugin 1.8 1.8 

A ... val -kiadás opció hozzáadva a Java 9-hez, ezt konfigurálhatjuk a Mavennél is.

Használjunk egy fordító plugin tulajdonságot a kiadás:

 8 

Vagy közvetlenül konfigurálhatjuk a fordító plugint:

  maven-compiler-plugin 8 

7. Következtetés

Ebben a rövid cikkben megtudtuk, mi okozza a java.lang.UnsupportedClassVersionError: Nem támogatott major.minor verzió hibaüzenetet, és hogyan lehet kijavítani.