☕
Flutterが使うJDKが特定されるルール
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を特定します:
- AndroidStudioがバンドルしているJDK
- 環境変数
JAVA_HOME
が指し示すJDK - (恐らく)ユーザーの 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