- JAVA
UnsupportedClassVersionErrorの直し方|版の対応表
UnsupportedClassVersionError は、新しい Java でコンパイルしたクラスを、それより前の版の Java で実行したときに出るエラーです。 エラー文の2つの数字を見れば、「何の版でコンパイルされ、何の版で実行しようとしたか」が分かります。
java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime
(class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
~~~~ ~~~~
Java 21 でコンパイルされた Java 17 で実行した
直し方は2つのどちらかです。
- 実行する Java を新しくする(コンパイルした版以上にする)
- 実行先の版に合わせてコンパイルし直す(
javac --release 17、Maven のmaven.compiler.releaseなど)
確認環境:Ubuntu 24.04、OpenJDK 8・11・17・21・25(同じクラスを各版で実行)(確認日 2026年10月10日)。Maven・Gradle の設定は公式ドキュメントで確認しています。
class file version と Java の対応表
| class file version | Java | 備考 |
|---|---|---|
| 52.0 | Java 8 | |
| 55.0 | Java 11 | |
| 61.0 | Java 17 | |
| 65.0 | Java 21 | |
| 69.0 | Java 25 |
Java の版=class file version − 44 で計算できます(例:65 − 44 = 21)。上の5つは、確認環境で実際にコンパイル・実行した値です。それ以外の版も同じ計算で、Java 9 が 53、Java 22 が 66、Java 26 が 70 です。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「UnsupportedClassVersionErrorの直し方|版の対応表」
再現:Java 25 でコンパイルして、各版で実行
Java 25 の javac でコンパイルした Hello.class を、Java 8・11・17・21・25 で実行しました。
== java 8
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 52.0
== java 11
Error: LinkageError occurred while loading main class Hello
java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 55.0
== java 17
... (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 61.0
== java 21
... (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 65.0
== java 25
Hello from Java 25.0.4.1
| 読むところ | 意味 |
|---|---|
class file version 69.0 |
コンパイルした Java の版(69 → Java 25) |
up to 52.0・55.0・61.0・65.0 |
実行している Java の版(52 → Java 8 …) |
1行目の A JNI error has occurred(Java 8) |
Java 8 で実行したときに付く表示。原因は同じ |
1行目の LinkageError occurred while loading main class(Java 11 以降) |
同上 |
直し方1:実行する Java を新しくする
実行環境の Java を、コンパイルした版以上にします。まず、実際にどの Java が使われているかを確かめます。
| 確認 | コマンド |
|---|---|
| 実行に使われる Java | java -version |
| コンパイルに使われる Java | javac -version |
| Maven が使う Java | mvn -v(Java version: の行) |
| Gradle が使う Java | gradle -v(JVM の行) |
java コマンドの場所 |
Windows は where java、Mac・Linux は which java |
JAVA_HOME |
Windows は echo %JAVA_HOME%、Mac・Linux は echo $JAVA_HOME |
java -version と javac -version が違う、JAVA_HOME と PATH の先頭の Java が違う、という状態がよくある原因です。Windows では、以前に入れた Java が PATH の前のほうに残っていることがあります。
直し方2:実行先の版に合わせてコンパイルする
実行環境の Java を変えられない(本番サーバーが Java 17 など)なら、--release で実行先の版を指定してコンパイルします。Java 25 の javac でも、Java 17 で動くクラスを作れます。
$ javac --release 17 -d out Hello.java ← javac は Java 25
$ file out/Hello.class
out/Hello.class: compiled Java class data, version 61.0 (Java SE 17)
$ java -cp out Hello ← java は Java 17
Hello from Java 17.0.20.1
-source・-target ではなく --release を使う
-source 17 -target 17 でも class file version は 61 になりますが、Java 21 で追加された API を使っていても、コンパイルが通ってしまいます。Java 21 で追加された List.reversed() を使ったコードで比べました。
import java.util.List;
public class Rev {
public static void main(String[] args) {
System.out.println(List.of(1, 2, 3).reversed()); // reversed() は Java 21 で追加
}
}
--- javac(Java 21)-source 17 -target 17
warning: [options] system modules path not set in conjunction with -source 17
1 warning ← コンパイルは通る
--- Java 17 で実行
Exception in thread "main" java.lang.NoSuchMethodError: 'java.util.List java.util.List.reversed()'
at Rev.main(Rev.java:5) ← 実行して初めてエラー
--- javac(Java 21)--release 17
Rev.java:5: error: cannot find symbol
System.out.println(List.of(1, 2, 3).reversed());
symbol: method reversed() ← コンパイルの時点で分かる
| オプション | class file version | 新しい API を使ったとき |
|---|---|---|
-source 17 -target 17 |
61(Java 17) | コンパイルが通り、実行時に NoSuchMethodError |
--release 17 |
61(Java 17) | コンパイルエラーで止まる |
--release は Java 9 以降の javac で使えます。
Maven・Gradle・IDE・Docker での設定
Maven
<properties>
<maven.compiler.release>17</maven.compiler.release>
</properties>
maven.compiler.source と maven.compiler.target を書いている場合は、maven.compiler.release に置き換えます。Spring Boot の親 POM を使っている場合は、<java.version>17</java.version> でも同じ指定になります。
Gradle(Kotlin DSL)
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17) // コンパイル・テストに使う JDK を指定
}
}
toolchain を指定すると、Gradle は手元の JDK を探す(無ければ取得する)ので、Gradle 自体を動かす Java と、コンパイルに使う Java を分けられます。toolchain を使わずに版だけを合わせるなら、tasks.withType<JavaCompile>().configureEach { options.release = 17 } です。
IDE
| IDE | 確認する場所 |
|---|---|
| IntelliJ IDEA | 「Project Structure」の「Project」の SDK と Language level、「Modules」の Language level、「Settings」の「Build Tools」→「Maven / Gradle」の JDK |
| Eclipse | プロジェクトの「プロパティ」→「Java コンパイラー」のコンプライアンス・レベル、「Java のビルド・パス」の JRE |
| VS Code | 設定 java.configuration.runtimes、Maven・Gradle の設定 |
Docker
ビルドに使うイメージと、実行に使うイメージの版がずれると、コンテナの中でこのエラーになります。
FROM eclipse-temurin:21-jdk AS build # ← ビルドは 21
...
FROM eclipse-temurin:17-jre # ← 実行が 17 だと UnsupportedClassVersionError
COPY --from=build /app/target/app.jar /app.jar
ビルドと実行の版を同じにするか、実行の版を新しくします。
似ているが別のエラー
javac の「class file has wrong version」
新しい Java でコンパイルされたライブラリ(jar)を、前の版の javac でコンパイルするときに出ます。Java 21 で作った jar を、Java 17 の javac で使いました。
UseLib.java:1: error: cannot access Greeter
bad class file: greeter.jar(/lib/Greeter.class)
class file has wrong version 65.0, should be 61.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
ライブラリが求める Java の版を確認し、JDK を新しくするか、そのライブラリの以前の版を使います(Spring Boot 3 以降は Java 17 以上、Spring Boot 4 も Java 17 以上が必要です)。
Unsupported class file major version 65
UnsupportedClassVersionError とは逆に、ビルドツールやライブラリが、新しい Java のクラスファイルを読めないときに出ます。Gradle を、その Gradle が対応していない新しい Java で動かしたとき、などです。
| Java | 動かすのに必要な Gradle |
|---|---|
| 17 | 7.3 以降 |
| 21 | 8.5 以降 |
| 25 | 9.1.0 以降 |
| 26 | 9.4.0 以降 |
数字(65 → Java 21)から、どの Java に対応した版のツールが要るかが分かります。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | エラー文の2つの数字 | class file version 65.0 と up to 61.0 → 21 でコンパイル、17 で実行 |
| 2 | 実行している Java | java -version、which java・where java |
| 3 | コンパイルした Java | javac -version、mvn -v、gradle -v |
| 4 | クラスファイル・jar の版 | javap -v -cp app.jar クラス名 | grep major(Mac・Linux は file Hello.class も可) |
| 5 | ビルドの設定 | maven.compiler.release、Gradle の toolchain、IDE の SDK |
| 6 | Docker のイメージ | ビルドと実行の FROM の版 |
よくある質問
Q. 自分のPCでは動くのに、サーバーにデプロイすると出ます。
A. 自分のPCの Java がサーバーより新しく、その版でコンパイルしています。--release(Maven は maven.compiler.release)でサーバーの版を指定してビルドし直すか、サーバーの Java を新しくします。
Q. IntelliJ IDEA では動くのに、コマンドの java -jar で出ます。
A. IDE は自分の設定の JDK で実行しますが、コマンドは PATH の先頭の Java で実行します。java -version で版を確認し、JAVA_HOME と PATH をそろえます。
Q. class file version 52.0 などの数字は何を表していますか。
A. クラスファイルの形式の版で、Java の版ごとに1つずつ増えます。Java 8 が 52、以降は「Java の版+44」です。
Q. 新しい Java で動かせば、以前の版でコンパイルしたクラスも動きますか。 A. 動きます。Java は、以前の版でコンパイルしたクラスを新しい版で実行できます。このエラーが出るのは、逆向き(新しい版でコンパイル → 以前の版で実行)のときだけです。
まとめ
UnsupportedClassVersionErrorは、新しい Java でコンパイル → 以前の版の Java で実行したエラー- class file version − 44 = Java の版。52 は Java 8、61 は 17、65 は 21、69 は 25
- 直し方は「実行する Java を新しくする」か「
--releaseで実行先の版に合わせてコンパイル」 -targetではなく--release。-targetは新しい API の使用を見逃し、実行時にNoSuchMethodErrorになるjava・javac・Maven・Gradle・IDE・Docker の Java の版をそろえる
参考・出典
確認日はいずれも 2026年10月10日です。
- Java Virtual Machine Specification(Java SE 25)「The class File Format」:https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-4.html
- Apache Maven Compiler Plugin「Setting the --release of the Java Compiler」:https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-release.html
- Gradle User Manual「Toolchains for JVM projects」:https://docs.gradle.org/current/userguide/toolchains.html
- Gradle User Manual「Compatibility Matrix」:https://docs.gradle.org/current/userguide/compatibility.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「UnsupportedClassVersionErrorの直し方|版の対応表」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。