Security Rules のテストを走らせようとしたら Unable to locate a Java Runtime で止まりました。Java は入っているのに見つからない状態です。原因は2つ重なっていて、しかもAndroid のビルドで必要な Java とはバージョンが違うという落とし穴つきでした。
01 — 一つ目の原因
Homebrew の openjdk は PATH に入らない
Homebrew で入れた openjdk は keg-only です。インストールされていても、
実行ファイルへのリンクが標準のパスに置かれません。which java は失敗し、
システムからは「Java が無い」ように見えます。
対処は、実行するときだけパスを通すことです。入れ直す必要も、シェルの設定を書き換える必要もありません。
export JAVA_HOME="/opt/homebrew/opt/openjdk"
export PATH="$JAVA_HOME/bin:$PATH"
npm test
設定ファイルを触らないほうがいいのは、後述のとおり用途によって必要なバージョンが違うからです。 恒久的に固定すると、別の作業で壊れます。
02 — 二つ目の原因
firebase-tools は JDK 21 未満を受け付けない
パスを通しても、古い Java だと今度は no longer supports Java version before 21
と言われて起動しません。手元に JDK 17 を入れて試しましたが、エミュレータ用途には使えませんでした。
| Firebase エミュレータ | JDK 21 以上が必要。それ未満は明示的に拒否されます。 |
|---|---|
| Android の AAB ビルド | JDK 17 を要求されます。 |
同じマシンで両方をやる場合、片方に合わせて環境変数を固定すると、もう片方が動かなくなります。
作業ごとに JAVA_HOME を切り替えるのが結局いちばん確実でした。
03 — なぜここで止まると困るか
ルールのテストは、書き換える前に通す
Security Rules は、緩すぎるとデータが読み放題・書き放題になり、厳しすぎると正規の操作が静かに失敗します。 どちらもアプリの画面からは気づきにくい壊れ方です。
そのため「ルールを変更する前にテストを通す」を作業手順として固定しています。 環境が理由でテストを飛ばすと、この決まりごとがそのまま形骸化するので、 詰まった時点で環境のほうを直すのが結局は早いという話でした。 上記の設定で55件のテストがすべて通ることを確認しています。
Follow
こういう記録を置いています
個人開発でつまずいた話や、作りかけのものは Instagram(@kenpiro1012)と note にも置いています。 記事の一覧は記事ページにまとまっています。