java.lang.UnsupportedClassVersionErrorの修正方法

1. 前書き

この短いチュートリアルでは、Javaランタイムエラー_java.lang.UnsupportedClassVersionError:Unsupported major.minor version_の原因とその修正方法を学習します。

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でコンパイルし、Javaで実行しようとしました。 8。

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_環境変数

_https://www.baeldung.com/find-java-home [JAVA_HOME] _変数がどのように設定されているかを確認することから始めましょう。 これにより、コマンドラインから_javac_を実行したときに使用されているJDKがわかります。
echo %JAVA_HOME%
C:\Apps\Java\jdk8-x64
完全に新しいlink:/jvm-vs-jre-vs-jdk[JDK]に移行する準備ができている場合は、新しいバージョンをダウンロードして、_PATH_およびhttps://を確認できます。 www.baeldung.com/java-home-on-windows-7-8-10-mac-os-x-linux[_JAVA_HOME_環境変数が適切に設定されています]。

3.2. 新しいJREの実行

例に戻って、より高いバージョンのJavaでエラーを実行することにより、エラーを解決する方法を見てみましょう。 _C:\ Apps \ jdk-11.0.2_にJava 11 JREがあると仮定すると、パッケージ化された_java_コマンドでコードを実行できます。
C:\Apps\jdk-11.0.2\bin\java com.baeldung.MajorMinorApp
Hello World!

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

*特定のバージョンのJavaまで実行できるようにするアプリケーションを作成している場合、そのバージョンのコードをコンパイルする必要があります。*
これは、3つの方法のいずれかで行うことができます。古いJDKを使用してコードをコンパイルする、_javac_コマンドの_-bootclasspath _、_- source_、および_-target_オプション(JDK 8以前)を使用する、または_– release_オプション(JDK 9以降)。
コードを実行するために新しいJREを使用したのと同様に、古いJDKを使用することから始めましょう。
C:\Apps\Java\jdk1.8.0_31\bin\javac com/baeldung/MajorMinorApp.java
_-source_と_-target_を使用することは可能ですが、それでも古いJavaと互換性のないクラスファイルを作成する可能性があります。
互換性を確保するために、ターゲットJREの_rt.jar_で_-bootclasspath_を指すことができます。
javac -bootclasspath "C:\Apps\Java\jdk1.8.0_31\jre\lib\rt.jar" \
  -source 1.8 -target 1.8 com/baeldung/MajorMinorApp.java
上記は主にJDK 8以前に適用されます。 * JDK 9では、__ source_および_-target_を置き換えるために-_– release_パラメーターが追加されました。 _–release_オプションは、ターゲット6、7、8、9、10、および11をサポートします。*
8_–release_を使用してJava 8をターゲットにしましょう。
javac --release 8 com/baeldung/MajorMinorApp.java
これで、Java 8以降のJREでコードを実行できます。

4. Eclipse IDE

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

4.1. JREの変更

すでにlink:/eclipse-change-java-version[Javaの異なるバージョンで構成されたEclipse]があると仮定して、プロジェクトのJREを変更しましょう。
_Projectプロパティに移動し、次にJava Build Pathに移動してから、_Libraries_タブに移動します。 そこに来たら、JREを選択して_Edit_をクリックします。
link:/uploads/BAEL-2308_ProjectPropertiesLib-100x77.jpg%20100w []
次に、代替JREを選択して、Java 11インストールをポイントします。
link:/uploads/BAEL-2308_ProjectEditJRE11-100x86.jpg%20100w []
この時点で、アプリケーションはJava 11に対して実行されます。

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

ここで、ターゲットをより低いレベルのJavaに変更する方法を見てみましょう。
まず、プロジェクトプロパティに戻り、次にJavaコンパイラに戻り、_プロジェクト固有の設定を有効にする_をチェックします。
link:/uploads/BAEL-2308_ProjectPropertiesCompilerLevel-100x103.jpg%20100w []
ここで、以前のバージョンのJava用にコンパイルし、他のコンプライアンス設定をカスタマイズするようにプロジェクトを設定できます。
link:/uploads/BAEL-2308_ProjectPropertiesCompilerLevel_dropdown-100x71.jpg%20100w []

5. IntelliJ IDEA

また、IntelliJ IDEAでコンパイルおよび実行するために使用しているJavaのバージョンを制御することもできます。

5.1. JDKの追加

それを行う前に、JDKを追加する方法を見ていきます。 _File-> Project Structure-> Platform Settings-> SDKs_に行きましょう:
link:/uploads/BAEL-2308_IDEA_AddSDK1-100x59.jpg%20100w []
中央の列のプラスアイコンをクリックして、ドロップダウンからfrom_JDK_を選択し、JDKの場所を選択します。
link:/uploads/BAEL-2308_IDEA_AddSDK2_2-100x54.jpg%20100w []

5.2. JREの変更

最初に、IDEAを使用して新しいJREでプロジェクトを実行する方法を見ていきます。
_Run->構成の編集…_に移動して、_JRE_を11に変更します。
link:/uploads/BAEL-2308_IDEA_ChangeJRE-100x63.jpg%20100w []
これで、プロジェクトを実行すると、Java 11 JREで実行されます。

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

下位のJREで実行するようにアプリケーションを配布する場合、コンパイラのレベルを調整して、古いバージョンのJavaをターゲットにする必要があります。
_File-> Project Structure…-> Project Settings-> Projectに移動して、Project SDKと_Project言語レベルを変更します。
link:/uploads/BAEL-2308_IDEA_ChangeTargetLevel-100x54.jpg%20100w []
これでプロジェクトをビルドでき、生成されたクラスファイルはJava 8以降で実行されます。

6. メーベン

link:/maven[Maven]でファイルをビルドおよびパッケージ化すると、ターゲットのlink:/maven-java-version[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でも同様に構成できます。*

    コンパイラプラグインプロパティを使用して_release_を設定しましょう。
<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_エラーメッセージの原因とその修正方法を学びました。