できない.dev

Java で「JAVA_HOME is not set」が出てビルドできない

Maven や Gradle が JAVA_HOME を要求するのは、コンパイルに JRE ではなく JDK が必要だからである。
JDK の場所を調べて JAVA_HOME に設定し、シェルの設定ファイルへ書いて永続化すれば解決する。

公開: 更新:

実行例あり(2026-10-02 に実環境で検証)

要約

JAVA_HOME を求めるエラーは、ビルドツールが JDK のインストール先を自力で特定できなかったときに出る。java コマンドが動いていても解決しないことがあるのは、実行だけなら JRE で足りるのに対し、コンパイルには javac を含む JDK が要るからである。

ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.

前者は Gradle の起動スクリプト、後者は Maven の起動スクリプトが出す。
どちらも「JDK の場所を教えてほしい」という同じ要求である。

実行例

Temurin 21 の入った Maven イメージで JAVA_HOME を bin ディレクトリまで含めて指すと、mvn -v は The JAVA_HOME environment variable is not defined correctly で終了コード 1 になった。readlink -f $(which javac) で調べた実体の 1 つ上を指すと Maven 3.10.0 が起動し、未設定でも PATH に java があれば起動するが、PATH からも java を外すと同じエラーに戻る。

$ java -version
openjdk version "21.0.12.1" 2026-08-18 LTS
OpenJDK Runtime Environment Temurin-21.0.12.1+1 (build 21.0.12.1+1-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.12.1+1 (build 21.0.12.1+1-LTS, mixed mode, sharing)
$ javac -version
javac 21.0.12.1
$ export JAVA_HOME=/opt/java/openjdk/bin
$ mvn -v
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.
$ echo $?
1
$ readlink -f $(which javac)
/opt/java/openjdk/bin/javac
$ export JAVA_HOME=/opt/java/openjdk
$ mvn -v
Apache Maven 3.10.0 (c43a36b8d67be7e0805a411bc0898af1a51f5472)
Maven home: /usr/share/maven
Java version: 21.0.12.1, vendor: Eclipse Adoptium, runtime: /opt/java/openjdk
Default locale: en_US, platform encoding: UTF-8, time zone: Etc/UTC
OS name: "linux", version: "6.6.87.2-microsoft-standard-wsl2", arch: "amd64", family: "unix"
$ echo $?
0
$ unset JAVA_HOME
$ mvn -v
Apache Maven 3.10.0 (c43a36b8d67be7e0805a411bc0898af1a51f5472)
Maven home: /usr/share/maven
Java version: 21.0.12.1, vendor: Eclipse Adoptium, runtime: /opt/java/openjdk
Default locale: en_US, platform encoding: UTF-8, time zone: Etc/UTC
OS name: "linux", version: "6.6.87.2-microsoft-standard-wsl2", arch: "amd64", family: "unix"
$ echo $?
0
$ export PATH=/usr/local/bin:/usr/bin:/bin
$ mvn -v
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.
$ echo $?
1

— 2026-10-02 時点の出力

検証環境

検証日
実行環境
maven:3-eclipse-temurin-21 Ubuntu 24.04.5 LTS
バージョン
  • Git 2.43.0

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. JDK が入っていない: java -version は通るのに javac -version が command not found になる環境は JRE だけの状態である。
    この場合は変数をいくら設定しても直らない。
  2. 未設定: Installing Apache Maven(新しいタブで開く) が前提とするとおり、Maven は JAVA_HOME を見て JDK を探す。
    ただし未設定のときは PATH 上の java を使うので、PATH に java があればそのまま起動する。
    止まるのは、JAVA_HOME が未設定で PATH にも java が無いときで、上の Maven のエラーが出る(Maven 3.9.16 で確認)。
  3. 指す場所が違う: JAVA_HOME に渡すのは bin の 1 つ上、つまり bin/javac を含むディレクトリである。/usr/lib/jvm/temurin-21/bin のように bin まで含めると bin/bin/java を探して失敗する(Maven の起動スクリプトは $JAVA_HOME/bin/java があるかを見る)。
  4. その場限りの export: 端末で export JAVA_HOME=... と打っただけでは、そのシェルを閉じると消える。
    CI やサービス起動では引き継がれない。
  5. 古いプロセスが残っている: 環境変数を設定しても、設定前から開いていた IDE やターミナルは古い値を持ち続ける。

解決策

1. JDK があるか確かめる

java -version
javac -version

javac が見つからないなら JDK を入れる。
ディストリビューションのパッケージ(temurin-21-jdk、openjdk-21-jdk など)でよい。

2. JDK のパスを特定する

macOS:

/usr/libexec/java_home -V
export JAVA_HOME=$(/usr/libexec/java_home -v 21)

Linux:

readlink -f $(which javac)
# /usr/lib/jvm/temurin-21-jdk-amd64/bin/javac
export JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64

javac の実体パスから /bin/javac を取り除いたものが JAVA_HOME である。

3. 永続化する

echo 'export JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64' >> ~/.bashrc
echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.bashrc

Windows は PowerShell を管理者権限で開き、システム環境変数に登録する。

[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Eclipse Adoptium\jdk-21", "Machine")

登録後は端末と IDE を開き直す。

4. Gradle だけで完結させる

プロジェクト単位で JDK を固定したいなら、Build Environment(新しいタブで開く) が説明する gradle.properties を使う。

org.gradle.java.home=/usr/lib/jvm/temurin-21-jdk-amd64

この指定は Gradle にしか効かないので、Maven も併用しているなら JAVA_HOME 側も設定しておく。

この記事は役立ちましたか?