新しい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で見つけることができた。
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の再インストールを行ったところ、再発しなくなった。なんだったんだろう…