Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaで「XXX has been compiled by a more recent version of the Java Runtime~」エラー(UnsupportedClassVersionError)が出る原因と対処方法について

投稿日:2022年4月28日 更新日:

 

<目次>

(1) Javaで「XXX has been compiled by a more recent version of the Java Runtime~」エラー(UnsupportedClassVersionError)が出る原因と対処方法について
 (1-1) エラーメッセージ・発生状況
 (1-2) 原因
 (1-3) 対策
 (1-4) (対策②)実行環境のバージョンUPの手順

(1) Javaで「XXX has been compiled by a more recent version of the Java Runtime~」エラー(UnsupportedClassVersionError)が出る原因と対処方法について

(1-1) エラーメッセージ・発生状況

jarファイルを「java -jar XXX.jar」コマンドで実行しようとした際に下記のエラーが出ました(Windows、Linux両方で同じエラー内容)

(エラーメッセージ)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: XXXXX 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
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
 
(図111①)Linuxの例。Terminalから実行すると上記エラー

(図112①)Windowsの例。cmdから実行すると上記エラー
 
(図111②)(参考)Linuxの例。画面でjarをダブルクリック実行した場合も同様のエラー
 
(図112②)(参考)Windowsの例。画面でjarをダブルクリック実行した場合も同様のエラー

(1-2) 原因

結論としては、コンパイルしたJavaのバージョンと、インストールされているJavaのバージョンの不一致のために起きています。
 
メッセージに記載の「XXXXX 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」の例で見ると、実行しようとしているjarファイルはJavaのバージョン55.0(Java 11)でコンパイルされていますが、皆様のマシンのJava環境はJavaのバージョン52.0(Java 8)である事が読み取れます。
 
ちなみに、この「55」や「52」といった数字とJavaのバージョンの関連性は次のようになっています。

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
58 = Java 14
 

(1-3) 対策

実行対象のjarをコンパイルしたJavaのバージョンと、ご自身の実行環境のJavaのバージョンを揃える形になりますが、大きく以下の2つ方向性になります。
 
(対策①)jarをリコンパイル
jarファイルの元となるプロジェクトやソースコード(.java)を保有している場合、実行環境のバージョン(例では「52=Java 8」)のJavaでコンパイルし直すことで、当該エラーが解消します。
 
(対策②)実行環境のバージョンUP
jarファイルの元となるプロジェクトやソースコード(.java)が無い場合(外部からダウンロードした等)は、環境のアップグレードをすれば解消します。

(1-4) (対策②)実行環境のバージョンUPの手順

・①初期状態ではJava 8が入っています。
 
(図131①)

・②新しいJava(jarをコンパイルしたVerより上のもの)をダウンロード&インストールします。
 
・ダウンロード(例:Windows 64bitの例)
 
(図132①)
・インストーラーを実行
(図132②)
(図132③)
(図132④)
(図132⑤)

・③環境変数の更新(JAVA_HOME、PATH)をします。
いずれも旧バージョン(例:Java 8)⇒新バージョン(例:Java 17)へ向き先を変更
 
・JAVA_HOMEの修正「例」
修正前:C:\Program Files\Java\jdk1.8.0_131
修正後:C:\Program Files\Java\jdk-17.0.1
 
(図133①)

・PATHの修正「例」
削除:C:\Program Files\Java\jdk1.8.0_131\bin
追加:C:\Program Files\Java\jdk-17.0.1\bin
 
(図133②)
 
(備考)よりスマートな記述
「%JAVA_HOME%\bin」とすれば、先程のJAVA_HOMEの値を活用できるため、今後Javaのバージョンが上がっても、PATHは修正せずに済みます。
 
・④Javaが新しいバージョンになったか?を次のコマンドで確認します。
 
> java -version
 
(図133③)

(出力例)
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, shari
 
・⑤エラーの解消確認
再度、jarファイルを実行してエラーが解消したか?を確認します。
 
(図134①)は私がエラーに遭遇したjarファイルで実施に試したものですが、当該エラーは出なくなりました(代わりに別のエラーが出ましたが💦)。
 
(図134①)
 
こちらのエラーについても、別途『★「Graphics Device initialization failed for :  es2, sw」エラーの原因と対処方法(Java FX関連)』でまとめていますので、もしご興味有る方はご覧ください。
 

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Javaのprintfで日付の書式設定を行う方法

<目次> (1) Javaのprintfで日付の書式設定を行う方法  (1-1) printfの基本構文  (1-2) 時刻に関するフォーマット  (1-3) 日付に関するフォーマット (1) Jav …

Javaで正規表現を使ってURLを文字列から検出する方法

<目次> (1) Javaで正規表現を使ってURLを文字列から検出する方法  (1-1) 構文  (1-2) 構文の説明  (1-3) サンプルプログラム  (1-4) ツールのご紹介 (1) Jav …

デッドロックとライブロックとは?両者の違いやサンプルプログラムをご紹介

  <目次> (1) デッドロックとライブロックとは?両者の違いやサンプルプログラムをご紹介  (1-1) デッドロック   (1-1-1) 概要   (1-1-2) サンプルプログラム   …

サーバサイドJava(JSP&サーブレット)のFORM認証を用いたログイン画面の開発

(0)目次&概説 (1) サーバー側JavaのFORM認証  (1-1) 認証の種類  (1-2) FORM認証の特徴  (1-3) FORM認証の実装概要 (2) FORM認証の実装手順  (2-1 …

サーブレットとは?その役割やHelloWorldサンプルコードのご紹介

(0)目次&概説 (1) サーブレットの基本  (1-1) サーブレットとは?  (1-2) サーブレットの前身技術との比較  (1-3) サーブレットとJSPの違い  (1-4) サーブレットのHe …

  • English (United States)
  • 日本語
Top