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

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

関連記事

「サーブレットコンテナ」や「サーブレットのライフサイクル」とは?(サンプルプログラム付)

※本記事は「サーブレットとは?その役割やHelloWorldサンプルコードのご紹介」の続編です。 (0)目次&概説 (2) サーブレットコンテナの基本  (2-1) サーブレットコンテナとは?  (2 …

Servlet(サーブレット)におけるフォワード(forward)とリダイレクト(redirect)の違い

<目次> (1) Servlet(サーブレット)におけるフォワード(forward)とリダイレクト(redirect)の違い  (1-1) フォワード(forward)とは?  (1-2) リダイレク …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)

(1) 仕様について (2) ソースコード  (2-1) AccessCounter2.java   (2-1-1) サンプルPG   (2-1-2) サンプルPG解説  (2-2) DbConnec …

Javaのabstractとは?抽象クラスの概要やサンプルPGをご紹介

<目次> (1) Javaのabstractとは?抽象クラスの概要やサンプルPGをご紹介  (1-1) 抽象クラス(abstract)とは  (1-2) 抽象クラスの目的や用途  (1-3) 抽象クラ …

JavaのArrrayListとLinkedListの違いについて

<目次> (1) JavaのArrrayListとLinkedListの違いについて  (1-1) 比較表(ArrayList vs LinkedList)  (1-2) まとめ  (1-3) 参考 …

  • English (United States)
  • 日本語
Top