Spring Bootのバージョン3のプロジェクトを作成して起動した時に発生したエラー「〜 java.lang.UnsupportedClassVersionError: 〜 SpringApplication has been compiled by a more recent version of the Java Runtime 〜」の原因と解決方法について説明しています。
※ 本ページはプロモーションが含まれています。
Java開発環境のEclipseで、SpringのスタータープロジェクトでSpring Bootのバージョン3系が選べるようになっていたので、試しにSpring Bootのバージョン3.1のプロジェクトを作成して、プロジェクト作成後すぐにSpring Bootアプリを起動したら、コンソールログにこのエラーが発生して起動できませんでした。
OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/SpringApplication has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 58.0
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
〜
本記事では、この起動時エラーの原因と解決方法と自分がやった事について説明しています。
ちなみに1行目の「OpenJDK 64-Bit Server VM warning」と、2行目以降の「Exception in thread "main" java.lang.UnsupportedClassVersionError〜」は別問題で、今回の本題は2行目以降の例外の方です。1行目位はwarningなので警告です。
◾️動作環境とバージョン情報です
OS:macOS Big Sur(バージョン11.7.7)
開発環境:Eclipse(Pleiades All in One Java Full Edition版)
起動時エラーの「Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/SpringApplication has been compiled by a more recent version of the Java Runtime 〜」の原因ですが、結論から言うとSpring Bootのバージョン3では、システム要件としてJavaのバージョンが最低でもJava17みたいで、今回は古いJavaを使おうとしたからこのエラーが発生していました。
Spring Boot3のシステム要件の詳細については、Spring Boot3.0のリリースノートを参考にしてください。
Spring Boot 3.0 Release Notes
原因は分かったけど、自分が使っているEclipse(Pleiades All in One)にはJavaがバンドルされているが、そのJavaのバージョンは一番新しくてもJava14なので、OpenJDK17(Java17)をインストールする事にしました。(2023/6/1時点のJDKの最新版は、LTSならJDK17、非LTSならDK20です。LTSは長期安定サポートの事。)
OpenJDK17のインストールについては別ページで説明しているので、良ければ参考にしてください。
OpenJDK17をインストールする【macOS】
そして、OpenJDK17をインストールできたら、EclipseでそのOpenJDK17を使用する設定をする必要があります。その設定方法についても別ページで説明しているので、そちらを参考にしてください。
EclipseのJavaプロジェクトで使うJDK(Java)を新規追加して設定する
これで、Spring Boot3系のプロジェクトでJDK17を使用するように設定してSpring Bootアプリを起動したら、問題の例外エラーは出なくなり起動できるようになりました!
本題のエラーは解決しましたが、起動時に一緒に出たワーニングについても説明しておきます。
警告メッセージ「OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.」をDeepLで翻訳したらこんな意味です。
OpenJDK 64-Bit Server VMの警告です: オプション-Xverify:noneと-noverifyは、JDK13で非推奨となり、将来のリリースで削除される可能性があります。
Spring Bootアプリの起動時のVMオプションで使っている-Xverify:noneと-noverifyが原因みたいなので、これをやめればこの警告は消えそうです。(ちなみに-Xverify:noneの方が、Javaバイトコードの検証を行わなくするオプションらしい。)
この警告は、-Xverify:noneと-noverifyのVMオプションは将来リリース版で使えなくなる可能性があるからという話なので、今は全然無視しても良さそうですが、それでも気になるから解決方法についてです。
EclipseのSpring Bootプロジェクトを右クリック->実行->実行の構成を選択して、実行構成画面を開きます。
実行構成画面のSpring Bootタブを選択して、高速スタートアップというのがあるので(英語版ならFast startup)、そのチェックボックスを外せばSpring Bootアプリ起動時の警告メッセージは出なくなります。
ただ、高速スタートアップのチェックを外せばいかにも高速でなくなりそうだし、チェックを外した時に今度はこの警告ダイアログが出ました。
Fast Startup Warning
Fast startup performs Java VM arguments tuning to enchance startup at the possible expense of a performance of the application during its runtime. It is recommended to use this setting for debugging purposes only
英語の警告文を見る限り、やっぱり高速スタートアップはスピードアップしてくれるみたいで、特にデバッグ時だけでも高速スタートアップにした方がいいと丁寧に言ってますね。やっぱり個人的には起動時の警告はスルーのままで良いかなと。
あと、Eclipseの設定を開いて、設定画面でSpring->Bootを選択すると、高速スタートアップをトリガーするJava VM引数という設定があります。
このVM引数にある-noverifyを消しても、Spring Bootアプリ起動時の警告メッセージは出なくなりました。
■編集前
-noverify -XX:TieredStopAtLevel=1
■編集後-XX:TieredStopAtLevel=1
まー繰り返しになりますが、起動時の警告はスルーしてれば良いかなと思います。