macOSでGradleを実行してもIDLEプロセス1つだけで進まなくなったら、ファイアウォールでブロックされているかもしれない

新しいMacBookを購入した人から、開発環境構築中に ./gradlew build がエラーになるとの相談を受けた。

地獄のようにハマったのでメモ。

状況

新しいMacBookにて、Gradleを使ったJavaプロジェクトで ./gradlew build を実行すると、IDLEプロセス1つの状態で全く進まない。

Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details
> IDLE

JDKのインストール、設定などは済んでいる。 gradlew が悪いのかとも思い、別途Gradleをインストールして gradle build しても変わらず。 --refresh-dependencies オプションをつけたり、 ./gradlew clean しても同様の結果となった。

./gradlew --status すると、STATUS, INFO ともに UNKNOWN のGradleデーモンがいくつか表示された。

Gradleデーモンを使っているのが問題かとも思い、 --no-daemon オプション付きで実行したがこれも変わらず。

-d --stacktrace オプション付きで実行すると、多少結果が変わり、以下のエラーが出力された。

[DEBUG] [org.gradle.launcher.daemon.client.DaemonClientConnection] thread 1: dispatching class org.gradle.launcher.daemon.protocol.Build
[DEBUG] [org.gradle.internal.remote.internal.inet.SocketConnection] Discarding EOFException: java.io.EOFException
[ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
[ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
[ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
[ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
[ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] The first result from the daemon was empty. Most likely the process died immediately after connection.

原因

エラーメッセージやら試したコマンドやら、正確にどうやって調べたかは覚えていないが、同じ症状の事例をGradle Forumsで見つけることができた。

discuss.gradle.org

I found out, that when disabling my firewall (ESET) the communication between the Gradle Wrapper Main process and the gradle daemon starts working again.

事例と同様、ESET Endpoint Securityを使っているので、試しにファイアウォールを一時停止したところ、問題なくGradleの各タスクが実行されるようになった。

対応

ファイアウォールを停止したままというのは問題なので、設定を「ルール付き自動モード」から「対話モード」に変更。

ネットワークアクセスの度に許可するかのダイアログが表示されるため、そこで許可することでひとまず対応。

ここも先のGradle Forumsでの対応と同じとなった。

Sadly the only advice they gave me so far was to switch my firewall to interactive mode and allow the requests coming from the gradle wrapper.

その後の問題と対応

Gitのブランチを切り替えてから ./gradlew build するとエラーになるという問題が発生。試行錯誤の中で、Gradleキャッシュがおかしな状態となっていた模様。

./gradlew clean build --refresh-dependencies することで、それ以降は再発しなくなった。

振り返り

ESET Endpoint Securityのファイアウォールがひとまずの原因だったが、同じタイミングでMacBookを更新した人もいるものの、そちらでは同様の事例は発生しなかった。

なぜこの問題が発生する/しない端末があるのかといった根本原因がわからず、他の人の端末でも何かの拍子に発生しないかがちょっと怖い。

また、発生端末ではlocalhostへのアクセスでも、初回は必ずダイアログが表示されるため、最初のうちはかなり面倒そうだった。より良い方法もありそうだが、いったんこの対応で作業してもらっている。

結びの言葉も、Gradle Forumsより引用。

I did not find a better solution yet.

追記

後ほど、該当端末でESETの再インストールを行ったところ、再発しなくなった。なんだったんだろう…