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つのどちらかです。

  1. 実行する Java を新しくする(コンパイルした版以上にする)
  2. 実行先の版に合わせてコンパイルし直す(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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?