So beheben Sie java.lang.UnsupportedClassVersionError

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, was den Java-Laufzeitfehler java.lang.UnsupportedClassVersionError verursacht: Nicht unterstützte major.minor-Version und wie Sie ihn beheben können.

2. Ein Blick auf den Fehler

Betrachten wir zunächst einen Beispielfehler:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/baeldung/MajorMinorApp has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

Dieser Fehler sagt uns, dass unsere Klasse mit einer höheren Java-Version kompiliert wurde als die Version, mit der wir versucht haben, sie auszuführen. In diesem Fall haben wir unsere Klasse mit Java 11 kompiliert und versucht, sie mit Java 8 auszuführen.

2.1. Java-Versionsnummern

Lassen Sie uns als Referenz einen kurzen Blick auf die Java-Versionsnummern werfen. Dies ist praktisch, wenn wir die entsprechende Java-Version herunterladen müssen.

Die Haupt- und Nebenversionsnummern werden im Klassenbytecode bei den Bytes sechs und sieben gespeichert.

Mal sehen, wie die Hauptversionsnummern Java-Versionen zugeordnet werden:

  • 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. Fix über die Kommandozeile

Lassen Sie uns nun diskutieren, wie wir diesen Fehler beheben können, wenn Java über die Befehlszeile ausgeführt wird.

Abhängig von unserer Situation haben wir zwei Möglichkeiten, diesen Fehler zu beheben: Kompilieren Sie unseren Code für eine frühere Java-Version oder führen Sie unseren Code auf einer neueren Java-Version aus .

Die endgültige Entscheidung hängt von unserer Situation ab. Wenn wir eine Drittanbieter-Bibliothek verwenden müssen, die bereits auf einer höheren Ebene kompiliert wurde, besteht unsere beste Option wahrscheinlich darin, unsere Anwendung mit einer neueren Java-Version auszuführen. Wenn wir eine Anwendung für die Verteilung verpacken, ist es möglicherweise am besten, sie auf eine ältere Version zu kompilieren.

3.1. JAVA_HOME Umgebungsvariable

Beginnen wir mit der Überprüfung, wie unsere Variable JAVA_HOME festgelegt ist. Hier erfahren wir, welches JDK verwendet wird, wenn wir javac über unsere Befehlszeile ausführen :

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

Wenn wir bereit sind, vollständig auf ein neueres JDK umzusteigen , können wir die neuere Version herunterladen und sicherstellen, dass unsere Umgebungsvariablen PATH und JAVA_HOME entsprechend festgelegt sind.

3.2. Ausführen einer neuen JRE

Zurück zu unserem Beispiel: Schauen wir uns an, wie wir den Fehler beheben können, indem wir ihn auf einer höheren Java-Version ausführen. Angenommen, wir haben Java 11 JRE in C: \ Apps \ jdk-11.0.2 , können wir unseren Code mit dem darin enthaltenen Java- Befehl ausführen :

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

3.3. Kompilieren mit einem älteren JDK

Wenn wir eine Anwendung schreiben, die bis zu einer bestimmten Java-Version ausgeführt werden soll, müssen wir den Code für diese Version kompilieren.

Wir können dies auf drei Arten tun: Verwenden eines älteren JDK zum Kompilieren unseres Codes, Verwenden der Optionen -bootclasspath , -source und -target des Befehls javac (JDK 8 und älter) oder Verwenden der Option –release (JDK) 9 und neuer).

Beginnen wir mit der Verwendung eines älteren JDK, ähnlich wie wir eine neuere JRE zum Ausführen unseres Codes verwendet haben:

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

Es ist möglich, nur -source und -target zu verwenden , es werden jedoch möglicherweise Klassendateien erstellt, die nicht mit einem älteren Java kompatibel sind.

Um die Kompatibilität sicherzustellen, können wir -bootclasspath auf die rt.jar der Ziel-JRE verweisen :

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

Dies gilt hauptsächlich für JDK 8 und niedriger. In JDK 9 wurde der Parameter –release hinzugefügt, um -source und -target zu ersetzen . Die Option –release unterstützt die Ziele 6, 7, 8, 9, 10 und 11.

Verwenden wir –release, um auf Java 8 abzuzielen :

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

Jetzt können wir unseren Code auf einer Java 8 oder höher JRE ausführen.

4. Eclipse IDE

Nachdem wir den Fehler und den allgemeinen Ansatz zur Korrektur verstanden haben, nehmen wir das Gelernte und sehen, wie wir ihn bei der Arbeit in der Eclipse-IDE anwenden können.

4.1. JRE ändern

Angenommen, wir haben Eclipse bereits mit verschiedenen Java-Versionen konfiguriert, ändern wir die JRE unseres Projekts.

Gehen wir zu unseren Projekteigenschaften , dann zu Java Build Path und dann zur Registerkarte Libraries . Dort wählen wir die JRE aus und klicken auf Bearbeiten :

Wählen wir nun Alternate JRE und verweisen auf unsere Java 11-Installation:

Zu diesem Zeitpunkt wird unsere Anwendung unter Java 11 ausgeführt.

4.2. Ändern der Compiler-Ebene

Schauen wir uns nun an, wie wir unser Ziel auf eine niedrigere Java-Ebene ändern können.

First, let's go back to our Project properties, then Java Compiler, and check Enable project specific settings:

Here, we can set our project to compile for earlier versions of Java and customize other compliance settings:

5. IntelliJ IDEA

We can also control the version of Java we're using for compiling and running in IntelliJ IDEA.

5.1. Adding a JDK

Before we do that, we'll see how to add additional JDKs. Let's go to File -> Project Structure -> Platform Settings -> SDKs:

Let's click the plus icon in the middle column, select the JDK from the drop-down, and select our JDK location:

5.2. Changing the JRE

First, we'll look at how to use IDEA to run our project on the newer JRE.

Let's go to Run -> Edit Configurations… and change our JRE to 11:

Now, when we run our project, it will run with the Java 11 JRE.

5.3. Changing the Compiler Level

If we're distributing our application to run on a lower JRE, we need to adjust our compiler level to target the older version of Java.

Let's go to File -> Project Structure… -> Project Settings -> Project and change our Project SDK and Project language level:

We can now build our project, and the class files generated will run on Java 8 and higher.

6. Maven

When we build and package a file in Maven, we can control the version of Java we target.

When using Java 8 or older, we set the source and target for the compiler plugin.

Lassen Sie uns die Quelle und das Ziel mithilfe der Eigenschaften des Compiler-Plugins festlegen:

 1.8 1.8 

Alternativ können wir die Quelle und das Ziel im Compiler-Plugin festlegen:

  maven-compiler-plugin  1.8 1.8   

Mit der in Java 9 hinzugefügten Option –release können wir dies auch mit Maven konfigurieren.

Verwenden wir eine Compiler-Plugin-Eigenschaft, um die Version festzulegen :

 8 

Oder wir können das Compiler-Plugin direkt konfigurieren:

  maven-compiler-plugin  8   

7. Fazit

In diesem kurzen Artikel haben wir erfahren, was die Fehlermeldung java.lang.UnsupportedClassVersionError: Nicht unterstützte Major.minor-Version verursacht und wie sie behoben werden kann.