Java で「JAVA_HOME is not set」が出てビルドできない
Maven や Gradle が JAVA_HOME を要求するのは、コンパイルに JRE ではなく JDK が必要だからである。
JDK の場所を調べて JAVA_HOME に設定し、シェルの設定ファイルへ書いて永続化すれば解決する。
公開: 更新:
要約
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-21Ubuntu 24.04.5 LTS- バージョン
- Git 2.43.0
この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。
よくある原因
- JDK が入っていない:
java -versionは通るのにjavac -versionがcommand not foundになる環境は JRE だけの状態である。
この場合は変数をいくら設定しても直らない。 - 未設定: Installing Apache Maven(新しいタブで開く) が前提とするとおり、Maven は
JAVA_HOMEを見て JDK を探す。
ただし未設定のときは PATH 上のjavaを使うので、PATH にjavaがあればそのまま起動する。
止まるのは、JAVA_HOMEが未設定で PATH にもjavaが無いときで、上の Maven のエラーが出る(Maven 3.9.16 で確認)。 - 指す場所が違う:
JAVA_HOMEに渡すのはbinの 1 つ上、つまりbin/javacを含むディレクトリである。/usr/lib/jvm/temurin-21/binのようにbinまで含めるとbin/bin/javaを探して失敗する(Maven の起動スクリプトは$JAVA_HOME/bin/javaがあるかを見る)。 - その場限りの
export: 端末でexport JAVA_HOME=...と打っただけでは、そのシェルを閉じると消える。
CI やサービス起動では引き継がれない。 - 古いプロセスが残っている: 環境変数を設定しても、設定前から開いていた IDE やターミナルは古い値を持ち続ける。
解決策
1. JDK があるか確かめる
java -version
javac -versionjavac が見つからないなら 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-amd64javac の実体パスから /bin/javac を取り除いたものが JAVA_HOME である。
3. 永続化する
echo 'export JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64' >> ~/.bashrc
echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.bashrcWindows は 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 側も設定しておく。