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.