0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gradle で「Java 21が見つからない」。JDKを入れても直らず、犯人はデーモンだった話【Gradle / JDK】

0
Posted at

はじめに

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

解決(まとめ)

  1. javac -versionJDK が入っているか確認(無ければ *-devel などコンパイラ入りを入れる)
  2. それでも直らないときは ./gradlew --stopデーモンを止めてからビルドし直す

学び

  • java があっても javac が無いことがある=実行はできてもコンパイルに必要な JDK が足りない。javac -version で確認。
  • Gradle のエラーが「直したのに直らない・しかも一瞬で失敗」のときは、デーモンが古い状態のまま動いている可能性。--stop でリセット。
  • 「入ってるのに見つからない」系は、実行用(JRE)と開発用(JDK=コンパイラ)の違いキャッシュ/常駐プロセスを疑うと早い。

おわりに

原因を1つ直して安心した直後に、もう1人の犯人(デーモン)が出てくる二段構え…😅 同じく「java はあるのに Gradle が Java を見つけてくれない」で固まった人の役に立てば嬉しいです🙌

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?