はじめに
EC2 の上でアプリ(Gradle)をビルドしようとしたら、こう怒られました。
Cannot find a Java installation ... matching {languageVersion=21} ...
> No locally installed toolchains match ...
「Java 21 が無い」?でも java -version を打つと、ちゃんと 21 と出ます。入ってるのに見つからない?しかも、原因だと思った所を直してもまだ失敗。犯人は2人いました。
「入ってるって言ってるのに、見つからないって何…?」と固まりました😅
環境
- AWS EC2(Amazon Linux 2023)※この話は EC2 でなくても起きます
- ビルド:Gradle(
./gradlew) - Java:Amazon Corretto 21
起きたこと①:java はあるのに javac が無い
ビルドを実行:
./gradlew build -x test
Cannot find a Java installation on your machine matching this tasks requirements:
{languageVersion=21, ...} for LINUX on x86_64.
> No locally installed toolchains match ...
java -version は 21 と出るのに、です。確認すると:
$ which java
/usr/bin/java # ある
$ which javac
# 出力なし=見つからない
$ java -version
openjdk version "21..." # ある
$ javac -version
-bash: javac: command not found # ★ コンパイラが無い
java(実行)はあるのに javac(コンパイラ)が無い=実行はできても、コンパイルに必要な JDK が足りない状態でした。Gradle はコンパイルをするので JDK が必要です。
今回入れていたのは java-21-amazon-corretto でしたが、これには javac が含まれていませんでした。JDK(コンパイラ入り)を追加します:
sudo dnf install -y java-21-amazon-corretto-devel
javac -version # → javac 21... が出ればOK
起きたこと②:JDKを入れても直らない(犯人はデーモン)
JDK を入れたので、もう一度ビルド。…また同じエラー。しかも3秒で即失敗しました。
これがヒントでした。Gradle は デーモンという常駐プロセスを使って高速化します。JDK を入れたあとも、Gradle デーモンが古い状態のまま動いていた可能性があります(だから一瞬で同じ結論を出した)。
デーモンを止めて、検出をやり直させます:
./gradlew --stop # 常駐デーモンを止める
./gradlew build -x test # 新しく立ち上がり、JDK を見つける
今度は BUILD SUCCESSFUL になりました。
なお、Gradle がどの JVM を認識しているかは次でも確認できます:
./gradlew -version
解決(まとめ)
-
javac -versionで JDK が入っているか確認(無ければ*-develなどコンパイラ入りを入れる) - それでも直らないときは
./gradlew --stopでデーモンを止めてからビルドし直す
学び
-
javaがあってもjavacが無いことがある=実行はできてもコンパイルに必要な JDK が足りない。javac -versionで確認。 - Gradle のエラーが「直したのに直らない・しかも一瞬で失敗」のときは、デーモンが古い状態のまま動いている可能性。
--stopでリセット。 - 「入ってるのに見つからない」系は、実行用(JRE)と開発用(JDK=コンパイラ)の違いやキャッシュ/常駐プロセスを疑うと早い。
おわりに
原因を1つ直して安心した直後に、もう1人の犯人(デーモン)が出てくる二段構え…😅 同じく「java はあるのに Gradle が Java を見つけてくれない」で固まった人の役に立てば嬉しいです🙌