Flutterが使うJDKが特定されるルール

2024/11/15に公開

jenvとAndroidStudio導入環境でFlutterのコマンドラインツールが使うかもしれないJDKがいくつか共存していて、いったいなにが使われるのか疑問に思ったので調べた。

・・・というか答えは flutter config に書かれています。

(snip)
    --jdk-dir                              The Java Development Kit (JDK) installation directory. If unset, flutter will search for one in
                                           the following order:
                                           1) the JDK bundled with the latest installation of Android Studio,
                                           2) the JDK found at the directory found in the JAVA_HOME environment variable, and
                                           3) the directory containing the java binary found in the user's path.
(snip)

まず flutter config --jdk-dir <path> で明示的にJDKを指定できます。
明示的に設定するとこのような結果になります(後述しますが検証目的以外での明示的な設定はオススメしません)

% flutter config --list
All Settings:
  enable-web: (Not set)
  enable-linux-desktop: (Not set)
  enable-macos-desktop: (Not set)
  enable-windows-desktop: (Not set)
  enable-android: (Not set)
  enable-ios: (Not set)
  enable-fuchsia: (Not set) (Unavailable)
  enable-custom-devices: (Not set)
  cli-animations: (Not set)
  enable-native-assets: (Not set) (Unavailable)
  enable-flutter-preview: (Not set) (Unavailable)
  enable-swift-package-manager: (Not set) (Unavailable)
  jdk-dir: /opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home

jdk-dir が未設定の場合(たいていの環境ではこうなっている)、以下の順番でJDKを特定します:

  1. AndroidStudioがバンドルしているJDK
  2. 環境変数 JAVA_HOME が指し示すJDK
  3. (恐らく)ユーザーの PATH からJDKを探す

この AndroidStudioがバンドルしているJDK をまずは探すので、HomebrewなどでJDKを別途導入していたりするとJDKのバージョンが合わなかったりして混乱します。

特に起こりがちなのは、flutterコマンドとgradlewコマンドを併用している環境でしょうか。Gradle WrapperはJDKを要求するので JAVA_HOME を設定するためにHomebrew経由でJDKを導入したりすると思うんですが、そのときバージョンが合わなくなってしまうことが多いので気をつけたい。

AndroidStudioのJDKを一貫して使用するようにするのが混乱がなくて良さそう。あるいは、 jenv のようなツールを活用するとか。

export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"

Discussion