error: release version 21 not supported は、「Java 21 向けにコンパイルして」と指定したのに、コンパイルに使っている JDK が 21 より前の版のときのエラーです。 pom.xml の指定ではなく、Maven が実際に使っている JDK が原因です。

mvn -v          # 「Java version:」の行が、Maven が使っている JDK
Apache Maven 3.9.11
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64   ← 17 で動いている
エラー pom.xml の書き方 意味
release version 21 not supported maven.compiler.release が 21 JDK が 21 より前の版
invalid target release: 21 maven.compiler.source・target が 21 同上(以前の書き方)
invalid flag: --release release を指定、JDK 8 で実行 JDK 8 の javac には --release が無い

直し方は「その版以降の JDK で Maven を動かす」です。JAVA_HOME を JDK 21 に向けると、同じ pom.xml で BUILD SUCCESS になりました。

確認環境:Ubuntu 24.04、Apache Maven 3.9.11、maven-compiler-plugin 3.10.1、Gradle 8.14.3、JDK 8・11・17・21・25(確認日 2026年10月10日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「release version not supportedの直し方|Maven」

再現:同じ pom.xml を JDK を変えてコンパイル

<properties>
  <maven.compiler.release>21</maven.compiler.release>
</properties>
Maven を動かした JDK 結果
JDK 8 Fatal error compiling: invalid flag: --release
JDK 11 Fatal error compiling: error: release version 21 not supported
JDK 17 Fatal error compiling: error: release version 21 not supported
JDK 21 BUILD SUCCESS
JDK 25 BUILD SUCCESS(新しい JDK は、以前の版向けにもコンパイルできる)
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile
  (default-cli) on project rel: Fatal error compiling: error: release version 21 not supported -> [Help 1]

「新しい JDK で、以前の版向けにコンパイルする」はできますが、「以前の JDK で、新しい版向けにコンパイルする」はできません。 公式ドキュメントでも、release に指定できるのは「使っている JDK の版と、それより前のいくつかの版」とされています。

いちばん多い原因:PATH の java と、Maven が使う JDK が違う

$ java -version
openjdk version "21.0.10" 2026-01-20          ← ターミナルの java は 21

$ mvn -v
Java version: 17.0.20.1, ... runtime: /usr/lib/jvm/java-17-openjdk-amd64   ← Maven は 17

Maven は JAVA_HOME の JDK を使います。 java -version が 21 でも、JAVA_HOME が 17 を指していれば、Maven は 17 でコンパイルします。確認環境でも、この状態で release version 21 not supported になりました。

OS JAVA_HOME の確認と設定
Linux・Mac echo $JAVA_HOME、export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64(Mac は export JAVA_HOME=$(/usr/libexec/java_home -v 21))
Windows echo %JAVA_HOME%。システムの環境変数で JDK 21 のフォルダーを設定し、ターミナルを開き直す

設定したら、mvn -v の「Java version」が 21 になったことを確かめます。

release・source・target の違い

書き方 意味 JDK が足りないときのエラー
maven.compiler.release その版の文法・クラスファイル・標準 API でコンパイル release version 21 not supported
maven.compiler.source・target 文法とクラスファイルの版だけ(以前の書き方) invalid target release: 21(javac を直接使うと invalid source release: 21)

release を使うのがおすすめです。source・target だけだと、指定した版に無い API(新しい JDK にだけあるメソッド)を使っていても、コンパイルは通ってしまいます。公式ドキュメントでも、--release なら指定した版に無い API の使用をエラーとして検出できるとされています。

JDK 8 で release を使うと invalid flag: --release になります(JDK 8 の javac には --release が無いため)。公式ドキュメントでは、maven-compiler-plugin 3.13.0 以降なら、JDK 8 では release を source・target に読み替えるとされています。

IDE・CI で起きるとき

IDE や CI は、ターミナルとは別の JDK を使っていることがあります。

場所 確認すること
IntelliJ IDEA プロジェクトの SDK と、Maven・Gradle を動かす JDK(Maven の Runner の JRE、Gradle JVM)が別々に設定されている。両方を確認する
VS Code Java の拡張機能が使う JDK の設定
GitHub Actions actions/setup-java の java-version
Docker でビルド ビルドに使うイメージの JDK の版(maven:3.9-eclipse-temurin-21 など)

Gradle の場合:toolchain で JDK を指定する

Gradle で options.release を指定し、JDK 17 で動かすと、同じエラーになりました。

Execution failed for task ':compileJava'.
> Java compilation initialization error
    error: release version 21 not supported

Gradle は toolchain を書くと、Gradle を動かしている JDK とは別に、コンパイル用の JDK を選びます。

// build.gradle.kts
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

確認環境では、Gradle を JDK 17 で動かしたまま、インストール済みの JDK 21(/usr/lib/jvm/java-21-openjdk-amd64)が自動で選ばれ、コンパイルが通りました。指定した版の JDK がどこにも無いときは、次のエラーになりました。

> Cannot find a Java installation on your machine (Linux ... amd64) matching: {languageVersion=22, ...}.
  Toolchain download repositories have not been configured.

Gradle 自体が新しい JDK に対応していないとき

コンパイルの版とは別に、Gradle を動かす JDK が、その Gradle の対応範囲より新しいと、ビルドが始まる前に失敗します。確認環境では、Gradle 8.14.3 を JDK 25 で動かすと、What went wrong: の下に 25.0.4.1 とだけ表示されて失敗しました。Gradle 公式の互換表では、Java 25 で Gradle を動かすには 9.1.0 以降が必要です。

Java Gradle を動かせる最初の版 toolchain で使える最初の版
21 8.5 8.4
24 8.14 8.14
25 9.1.0 9.1.0

実行時のエラーとの違い

エラー 起きるとき 意味
release version 21 not supported コンパイル時 コンパイルする JDK が、指定した版より前
UnsupportedClassVersionError ... class file version 65.0 実行時 実行する JRE が、コンパイルした版より前の版

コンパイルは JDK 21 で通っても、実行するサーバーの Java が 17 なら、実行時に UnsupportedClassVersionError になります。release は、実行する環境の Java の版に合わせます。

確認の手順(チェックリスト)

順番 確認すること 方法
1 Maven が使っている JDK mvn -v の「Java version」
2 JAVA_HOME echo $JAVA_HOME(Windows は %JAVA_HOME%)
3 pom.xml の指定 maven.compiler.release、source・target、<release>
4 IDE・CI の JDK IDE の Maven・Gradle 用の JDK、setup-java の版
5 Gradle なら toolchain の指定と、Gradle を動かす JDK の版
6 実行する環境の Java release をそれ以下にする

よくある質問

Q. JDK 21 をインストールしたのに直りません。 A. インストールしただけでは、JAVA_HOME は以前の JDK のままのことがあります。mvn -v で、Maven が使っている JDK を確かめます。

Q. release を 17 に下げてもよいですか。 A. 実行する環境が Java 17 で、Java 21 の機能を使っていないなら、17 に合わせるのは正しい直し方です。Java 21 の機能(仮想スレッドなど)を使っているなら、コンパイルでエラーになります。

まとめ

  • 指定した版より前の JDK でコンパイルしているのが原因。mvn -v の「Java version」を見る
  • Maven は JAVA_HOME の JDK を使う。java -version と違うことがある
  • release を使う。source・target は、指定した版に無い API の使用を検出しない
  • JDK 8 では invalid flag: --release(maven-compiler-plugin 3.13.0 以降は読み替える)
  • Gradle は toolchain で、コンパイル用の JDK を自動で選べる
  • 実行時の UnsupportedClassVersionError とは別。release は実行する環境の版に合わせる

参考・出典

確認日はいずれも 2026年10月10日です。

  • 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「Compatibility Matrix」:https://docs.gradle.org/current/userguide/compatibility.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「release version not supportedの直し方|Maven」

株式会社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で一緒に開発しながら、 成長を楽しみませんか?