Blog / Firebase

Firebase エミュレータが Java で起動しない

JDK 21 未満は拒否される。Androidビルドとは必要なバージョンが違う

2026年8月16日 公開 / Firebase ・ Java ・ 開発環境

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 にも置いています。 記事の一覧は記事ページにまとまっています。