Java バージョン不一致エラー「class file has wrong version」の解決法
問題の本質
Javaプロジェクトをビルド中に「class file has wrong version 61.0, should be 55.0」というエラーが発生する現象は、Java実行環境のバージョンと依存ライブラリのコンパイルバージョンに互換性がない場合に生じます。このエラーは通常、以下の状況で現れます:
java: cannot access org.springframework.beans.factory.annotation.Autowired
bad class file: /.../spring-beans-6.0.2.jar!/.../Autowired.class
class file has wrong version 61.0, should be 55.0
キーポイント
- 55.0 = Java 11のクラスファイルバージョン
- 61.0 = Java 17のクラスファイルバージョン
- Spring Framework 6以降はJava 17以上を必須とする
主な原因
このエラーが発生する主要な原因は次の通りです:
Spring Framework 6.x/Spring Boot 3.xの使用:
- Spring 6ではJava 17以降が必要
- プロジェクトでJava 11を使用している場合、バージョン互換性がない
IDEとビルドツールの設定不一致:
- IntelliJのプロジェクト設定がJava 11
- Maven/GradleのコンパイラがJava 17を使用
環境変数JAVA_HOMEの不整合:
- ターミナルで
java -version
がJava 11を表示 - 実際のビルドではJava 17の依存ライブラリが使用される
- ターミナルで
バージョン対応表
ツール・フレームワーク | Java 11に対応 | Java 17必須 |
---|---|---|
Spring Framework 5.x | ✅ | ❌ |
Spring Framework 6.x | ❌ | ✅ |
Spring Boot 2.x | ✅ | ❌ |
Spring Boot 3.x | ❌ | ✅ |
解決方法
方法1: Javaバージョンを17にアップグレード(推奨)
Spring 6/Spring Boot 3を使用する場合はJava 17への移行が必要です。
IntelliJでの設定変更:
File > Project Structure > Project Settings > Project
- Project SDKをJava 17に設定
- Project language levelも17に設定
Mavenプロジェクトの設定(pom.xml):
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
Gradleプロジェクトの設定(build.gradle):
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
環境変数の変更:
# Linux/macOS
export JAVA_HOME="/path/to/jdk-17"
# Windows (コマンドプロンプト)
setx JAVA_HOME "C:\path\to\jdk-17"
方法2: Spring Bootを2.x系にダウングレード
Java 11を継続使用する場合:
pom.xmlの変更例:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version> <!-- 最新の2.xバージョン -->
</parent>
<properties>
<java.version>11</java.version>
</properties>
Spring Initializrを利用:
- start.spring.ioにアクセス
- Spring Bootバージョンで
2.7.x
を選択 - Javaバージョンで
11
を指定 - プロジェクトを再生成してインポート
追加検証ポイント
複数のJavaバージョンが混在していないか確認:
bash# ターミナルで実行 java -version javac -version mvn -v | grep "Java version"
IDE設定の再確認:
- Maven/Gradle実行時のJDKが正しいか
- キャッシュの影響を排除するため
File > Invalidate Caches
を実行
依存ライブラリの一貫性確認:
bash# Mavenの場合 mvn dependency:tree # Gradleの場合 gradle dependencies
注意点
.m2
リポジトリを削除する方法は一時的な解決策に過ぎず、根本原因を解消しません- 依存関係でバージョンを指定しない方法(
<version>
タグの削除)は非推奨です
よくある質問
Q: Java 17にアップグレードするデメリットは?
既存のライブラリがJava 17に対応していない可能性があります。ただし多くの主要ライブラリは既に対応済みであり、移行は長期サポートを考慮すると推奨されます。
Q: IntelliJの設定は変更したのにエラーが続くのはなぜ?
Maven/Gradleのビルド設定、環境変数JAVA_HOME
、実行構成の設定をすべて確認してください。プロジェクト再読み込み(mvn clean install
またはGradle同期)も有効です。
まとめ
「class file has wrong version」エラーはJava実行環境とSpringのバージョン不一致が主な原因です。以下のいずれかの方法で解決できます:
- Java 17にアップグレード(最新機能を使用する場合)
- Spring Boot 2.xを使用(既存Java 11環境を維持する場合)
プロジェクト開始時にはSpring InitializrでJavaバージョンとSpring Bootバージョンの整合性を確認し、環境変数とIDE設定の一貫性を保つことが再発防止に効果的です。