1. 序章

この短いチュートリアルでは、Javaランタイムエラー java .lang.UnsupportedClassVersionError:サポートされていないmajor.minorversionの原因とその修正方法を学習します。

2. エラーを見てください

エラーの例から始めましょう。

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

このエラーは、クラスが実行しようとしたバージョンよりも高いバージョンのJavaでコンパイルされたことを示しています。より具体的には、この場合、クラスをJava 11でコンパイルし、実行しようとしました。 Java8でそれを。

2.1. Javaバージョン番号

参考までに、Javaのバージョン番号を簡単に見てみましょう。 これは、適切なJavaバージョンをダウンロードする必要がある場合に役立ちます。

メジャーバージョン番号とマイナーバージョン番号は、クラスのバイトコードの6バイト目と7バイト目に格納されます。

メジャーバージョン番号がJavaバージョンにどのようにマッピングされるかを見てみましょう。

  • 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. コマンドラインから修正

次に、コマンドラインからJavaを実行するときにこのエラーを解決する方法について説明します。

状況に応じて、このエラーを解決する方法は2つあります。以前のバージョンのJava用にコードをコンパイルするか、新しいバージョンのJavaでコードを実行します。

最終的な決定は私たちの状況に依存します。 すでに上位レベルでコンパイルされているサードパーティのライブラリを使用する必要がある場合は、おそらく新しいJavaバージョンを使用してアプリケーションを実行するのが最善の方法です。 配布用にアプリケーションをパッケージ化する場合は、古いバージョンにコンパイルするのが最適な場合があります。

3.1. JAVA_HOME環境変数

JAVA_HOME変数がどのように設定されているかを確認することから始めましょう。 これにより、コマンドラインからjavacを実行したときに使用されているJDKがわかります。

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

完全に新しいJDKに移行する準備ができたら、新しいバージョンをダウンロードして、PATHおよびJAVA_HOME環境変数が適切に設定されていることを確認できます

3.2. 新しいJREの実行

例に戻り、Javaの上位バージョンで実行してエラーを解決する方法を見てみましょう。 C:\ Apps \jdk-11.0.2にJava11JREがあるとすると、javaコマンドがパッケージ化されたコードを実行できます。

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

3.3. 古いJDKでコンパイルする

Javaの特定のバージョンまで実行可能にするアプリケーションを作成している場合は、そのバージョンのコードをコンパイルする必要があります。

これは、次の3つの方法のいずれかで実行できます。古いJDKを使用してコードをコンパイルする。 [X86X] javac コマンド(JDK 8以前)の -bootclasspath -source 、および-targetオプションを使用します。 または、 –release オプション(JDK 9以降)を使用します。

コードを実行するために新しいJREを使用したのと同様に、古いJDKを使用することから始めましょう。

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

-source-targetを使用することは可能ですが、それでも古いJavaと互換性のないクラスファイルが作成される可能性があります。

互換性を確保するために、-bootclasspathをターゲットのJREのrt.jarにポイントできます。

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

上記は主にJDK8以下に適用されます。 JDK 9では、-sourceおよび-targetを置き換えるために–releaseパラメーターが追加されました。 –releaseオプションは、ターゲット6、7、8、9、10、および11をサポートします。

–releaseを使用してJava8をターゲットにしましょう。

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

これで、Java8以降のJREでコードを実行できます。

4. Eclipse IDE

エラーとそれを修正するための一般的なアプローチを理解したので、学んだことを取り入れて、EclipseIDEで作業するときにエラーを適用する方法を見てみましょう。

4.1. JREの変更

すでにEclipseが異なるバージョンのJavaで構成されていると仮定して、プロジェクトのJREを変更してみましょう。

プロジェクトプロパティ Javaビルドパスライブラリタブの順に移動しましょう。 そこで、JREを選択し、編集をクリックします。

次に、 Alternative JRE を選択し、Java11のインストールをポイントします。

この時点で、アプリケーションはJava11に対して実行されます。

4.2. コンパイラレベルの変更

次に、ターゲットをより低いレベルのJavaに変更する方法を見てみましょう。

まず、プロジェクトのプロパティに戻り、次に Javaコンパイラに戻り、プロジェクト固有の設定を有効にするをオンにします。

ここで、以前のバージョンのJava用にコンパイルし、他のコンプライアンス設定をカスタマイズするようにプロジェクトを設定できます。

5. IntelliJ IDEA

IntelliJIDEAでのコンパイルと実行に使用しているJavaのバージョンを制御することもできます。

5.1. JDKの追加

その前に、JDKを追加する方法を説明します。 ファイル->プロジェクト構造->プラットフォーム設定->SDKに移動しましょう。

中央の列のプラスアイコンをクリックし、ドロップダウンから JDK を選択して、JDKの場所を選択します。

5.2. JREの変更

まず、IDEAを使用して新しいJREでプロジェクトを実行する方法を見ていきます。

実行->構成の編集…に移動し、JREを11に変更します。

プロジェクトを実行すると、Java11JREで実行されます。

5.3. コンパイラレベルの変更

下位のJREで実行するようにアプリケーションを配布する場合は、古いバージョンのJavaをターゲットにするようにコンパイラレベルを調整する必要があります。

ファイル->プロジェクト構造…->プロジェクト設定->プロジェクトに移動し、プロジェクトSDKプロジェクト言語レベルを変更しましょう。

これでプロジェクトをビルドでき、生成されたクラスファイルはJava8以降で実行されます。

6. Maven

Maven でファイルをビルドしてパッケージ化すると、ターゲットとするJavaバージョンを制御できます。

Java 8以前を使用する場合、コンパイラプラグインのソースとターゲットを設定します。

コンパイラプラグインのプロパティを使用して、ソースとターゲットを設定しましょう。

<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>

または、コンパイラプラグインでソースとターゲットを設定することもできます。

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

Java 9で追加された–release オプションを使用すると、Mavenでも構成できます。

コンパイラプラグインのプロパティを使用して、リリースを設定しましょう。

<properties>
    <maven.compiler.release>8</maven.compiler.release>
</properties>

または、コンパイラプラグインを直接構成することもできます。

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <release>8</release>
        </configuration>
    </plugin>
</plugins>

7. 結論

この記事では、 java.lang.UnsupportedClassVersionError:Unsupported major.minor version エラーメッセージの原因と、その修正方法について説明しました。