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 の場所を教えてほしい」という同じ要求である。
よくある原因
- JDK が入っていない:
java -versionは通るのにjavac -versionがcommand not foundになる環境は JRE だけの状態である。
この場合は変数をいくら設定しても直らない。 - 未設定: Installing Apache Maven(新しいタブで開く) が前提とするとおり、Maven は
JAVA_HOMEを見て JDK を探す。
設定していなければそのまま止まる。 - 指す場所が違う:
JAVA_HOMEに渡すのはbinの 1 つ上、つまりbin/javacを含むディレクトリである。/usr/lib/jvm/temurin-21/binのようにbinまで含めるとbin/bin/javacを探して失敗する。 - その場限りの
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 側も設定しておく。