Skip to content

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以上を必須とする

主な原因

このエラーが発生する主要な原因は次の通りです:

  1. Spring Framework 6.x/Spring Boot 3.xの使用

    • Spring 6ではJava 17以降が必要
    • プロジェクトでJava 11を使用している場合、バージョン互換性がない
  2. IDEとビルドツールの設定不一致

    • IntelliJのプロジェクト設定がJava 11
    • Maven/GradleのコンパイラがJava 17を使用
  3. 環境変数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での設定変更

  1. File > Project Structure > Project Settings > Project
  2. Project SDKをJava 17に設定
  3. Project language levelも17に設定

Mavenプロジェクトの設定(pom.xml)

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)

groovy
java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

環境変数の変更

bash
# 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の変更例

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を利用

  1. start.spring.ioにアクセス
  2. Spring Bootバージョンで2.7.xを選択
  3. Javaバージョンで11を指定
  4. プロジェクトを再生成してインポート

追加検証ポイント

  1. 複数のJavaバージョンが混在していないか確認

    bash
    # ターミナルで実行
    java -version
    javac -version
    mvn -v | grep "Java version"
  2. IDE設定の再確認

    • Maven/Gradle実行時のJDKが正しいか
    • キャッシュの影響を排除するためFile > Invalidate Cachesを実行
  3. 依存ライブラリの一貫性確認

    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のバージョン不一致が主な原因です。以下のいずれかの方法で解決できます:

  1. Java 17にアップグレード(最新機能を使用する場合)
  2. Spring Boot 2.xを使用(既存Java 11環境を維持する場合)

プロジェクト開始時にはSpring InitializrでJavaバージョンとSpring Bootバージョンの整合性を確認し、環境変数とIDE設定の一貫性を保つことが再発防止に効果的です。