GradleとJavaバージョンの互換性問題
エラー概要
Unsupported class file major version 61
エラーは、プロジェクトのGradleバージョンとJavaバージョンの互換性が失われた際に発生します。環境アップデート後のFlutterプロジェクトで頻発する問題です。典型的な環境:
✅ Gradle 6.8.3
✅ Java 17
✅ Flutter 3.7.12+
✅ Android Studio 2022.2.1+
問題の原因
Java 17(クラスファイルバージョン61)はGradle 6.8.3と互換性がありません。
Gradle公式互換性マトリックスによれば:
Gradleバージョン | サポートJavaバージョン |
---|---|
6.x | 8〜13 |
7.0+ | 8〜17 |
8.1+ | 8〜21 |
Android Studioの更新でJavaバージョンが17以上にアップグレードされると、古いGradleを使用しているプロジェクトでクラッシュが発生します。
解決策:互換性の確保
最も推奨される方法はGradleのアップグレードですが、プロジェクトのアップグレードが困難な場合はJavaパスの明示的設定でも対処可能です。
✅ 解決法1:Gradleのバージョンアップ (推奨)
android/gradle/wrapper/gradle-wrapper.properties
を編集:propertiesdistributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip
Android Gradle Pluginを更新 (
android/build.gradle
):groovydependencies { classpath 'com.android.tools.build:gradle:8.3.2' // AGP 8.3.2以上 }
JDKバージョンをFlutterに明示:
bash# Mac/Linux例 flutter config --jdk-dir /usr/lib/jvm/java-17-openjdk-amd64/ # Windows例 flutter config --jdk-dir "C:\Program Files\Java\jdk-17"
プロジェクトの再ビルド:
bashflutter clean flutter pub get ./gradlew cleanBuildCache # Androidディレクトリで実行
互換性チェック方法
以下のサイトで使用中のJavaバージョンに合ったGradleバージョンを確認:
Gradle-Java Compatibility Matrix
✅ 解決法2:プロジェクトを変更せずにJavaパスを設定
既存のGradleバージョンを維持する場合:
android/gradle.properties
にJavaホームパス追加:propertiesorg.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64
FlutterのJDKディレクトリを設定:
bashflutter config --jdk-dir "パス/to/Javaインストール"
Javaパスの特定方法
Linux/macOS(SDKMAN利用時):
echo "$HOME/.sdkman/candidates/java/17.0.11-amzn"
Windows(Android Studio内蔵JDK):
C:\Program Files\Android\Android Studio\jbr
✅ トラブルシューティング追加手順
Android Studioのキャッシュ削除:
File > Invalidate Caches / Restart
複数Javaバージョンの競合解消:
bash# javaコマンドのパスを固定 sudo update-alternatives --config java
環境変数の確認:
bashecho $JAVA_HOME # Linux/macOS echo %JAVA_HOME% # Windows
根本原因と予防策
BUG! exception in phase 'semantic analysis'
の根本原因は Gradleの古いバージョンが高いJavaバージョンを解釈できない点 です。予防方法:
- Android Studioを更新前に
gradle-wrapper.properties
のバージョンをチェック - Flutterプロジェクトの定期的なGradleアップグレード
- bashで常に明示的なパスを指定
flutter config --jdk-dir
これにより、開発環境のJavaバージョン変更時にも互換性を確保できます。