Gradleビルドにおける「Unsupported class file major version 65」エラーの解決方法
問題概要
Java 21環境でGradleビルドを実行する際、以下のエラーが発生することがあります:
startup failed:
General error during conversion: Unsupported class file major version 65
java.lang.IllegalArgumentException: Unsupported class file major version 65
at groovyjarjarasm.asm.ClassReader.<init>(ClassReader.java:199)
...
このエラーは主に:
- Java 21でコンパイルされたクラスファイルを、古いバージョンのJava実行環境が解釈しようとした場合
- Gradleの内部コンポーネント(特にGroovyコンパイラ)がJava 21を完全にサポートしていない場合
- プロジェクト設定と実行環境のJavaバージョンに不一致がある場合
に発生します。
典型的な事象として:
gradle.properties
でJava 21を指定するとエラー発生- Java 17に切り替えると正常にビルド
- 再度Java 21に戻すとビルド成功 ← 一時キャッシュが影響
根本的な解決方法
1. GradleツールチェーンでJavaバージョン指定
最も推奨される方法で、プロジェクトのbuild.gradle
に以下を追加:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21) // プロジェクトのJavaバージョンを明確に指定
}
}
利点:
- プロジェクト固有のJavaバージョンを直接定義
- ローカル環境に依存しないビルドが可能
- 異なるバージョンのJDKが混在する状況を避けられる
2. ソース互換性の明示的な指定
build.gradle
にJavaバージョンを明示:
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
注意点
sourceCompatibility
とtargetCompatibility
の両方を設定することが重要です。片方のみでは不十分な場合があります。
3. Gradleキャッシュのクリア
環境変更後に以下のコマンドでキャッシュを削除:
# 現在実行中のGradleデーモンを停止
./gradlew --stop
# プロジェクトのビルドキャッシュを削除
rm -rf .gradle build
# グローバルキャッシュを削除 (必要に応じて)
rm -rf ~/.gradle/caches
4. Gradleバージョンの更新
gradle-wrapper.properties
で最新のGradleを使用(Java 21完全サポートは8.6以降):
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
注意
プロジェクトがAndroidの場合は、com.android.tools.build:gradleプラグインのバージョンも更新が必要です(後述)
5. 環境変数の整合性確認
システム全体のJava環境設定を確認:
# 現在のJAVA_HOMEを確認
echo $JAVA_HOME
# Gradleが使用中のJavaバージョンを確認
./gradlew --version | grep "Java version"
問題のある例:
JAVA_HOME: /path/to/jdk-17
Gradleが使用: /path/to/jdk-21 → 不一致がエラーの原因
環境別の追加対応
Androidプロジェクトの場合
android/settings.gradle
とgradle-wrapper.properties
を更新:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
plugins {
id "com.android.application" version "8.3.2" apply false
}
IntelliJ利用時の設定
- File > Project Structure
- Project SDK: Java 21 設定
- Project language level: 21
- Build, Execution, Deployment > Build Tools > Gradle
- Gradle JVM: "Project SDK (Java 21)" を選択
回避策のリスク
// 非推奨な回避策(根本解決にならない)
sourceCompatibility = JavaVersion.VERSION_17 // 本来のバージョンより下げる
警告
Javaバージョンを意図的に下げる方法は一時的な回避策に留め、最新のJavaバージョンに対応した正しい解決方法を実装してください
補足:クラスファイルバージョン対応表
Javaバージョン | classファイルメジャーバージョン |
---|---|
Java 17 | 61 |
Java 18 | 62 |
Java 19 | 63 |
Java 20 | 64 |
Java 21 | 65 |
永続的な解決のためのチェックリスト
- [ ]
gradle-wrapper.properties
でGradle 8.6以降を指定 - [ ]
build.gradle
でJavaツールチェーンを設定 - [ ] ソース互換性(VERSION_21)を明示的に指定
- [ ] システム環境変数
JAVA_HOME
がJava 21を指している - [ ] IDE設定がJava 21に統一されている
- [ ] 依存ライブラリがJava 21をサポートしている
最新のJavaバージョンへの移行には、ツールチェーンの適切な設定と環境全体の整合性確認が不可欠です。上記の解決方法を段階的に適用することで、「Unsupported class file major version 65」エラーを根本的に解決できます。