11.

【Javaエラー】Unsupported major.minor version 52.0

編集
この記事の要点
  • Unsupported major.minor version 52.0クラスファイルの Java バージョンが実行環境より新しいとき発生
  • 52.0 = Java 8 (1.8) でコンパイルされたクラスを Java 7 以前で実行しようとした
  • 対処 ①: 実行環境の JVM を Java 8 以上にアップグレード
  • 対処 ②: ソースを Java 7 でコンパイルし直し(javac -source 1.7 -target 1.7
  • クラスファイルバージョン早見表: 52=Java8 / 53=Java9 / 55=Java11 / 61=Java17 / 65=Java21

 

エラーの意味

Java の実行時に以下のエラーが出ることがあります:

java.lang.UnsupportedClassVersionError: com/example/Hello :
  Unsupported major.minor version 52.0

これは「このクラスファイル(.class)は、現在の JVM ではサポートされていないバージョンです」というエラーです。具体的には:

  • 52.0 = Java 8 (1.8) でコンパイルされたクラスファイル
  • それを Java 7 以前の JVM で実行しようとして失敗

クラスファイルバージョン早見表

major versionJava バージョンリリース年
45.xJava 1.11997
46.0Java 1.21998
47.0Java 1.32000
48.0Java 1.42002
49.0Java 52004
50.0Java 62006
51.0Java 72011
52.0Java 8 (LTS)2014
53.0Java 92017
54.0Java 102018
55.0Java 11 (LTS)2018
56.0Java 122019
57.0Java 132019
58.0Java 142020
59.0Java 152020
60.0Java 162021
61.0Java 17 (LTS)2021
62.0Java 182022
63.0Java 192022
64.0Java 202023
65.0Java 21 (LTS)2023

原因の特定

1. 現在の JVM バージョンを確認

java -version
# 例:
# java version "1.7.0_80"  ← Java 7 だと 52.0 (Java 8) を実行できない

2. クラスファイルのバージョンを確認

javap -v MyClass.class | grep "major version"
# 例:
# major version: 52  ← このクラスは Java 8 でコンパイルされている

3. ファイルから直接バージョンを確認

# .class ファイルの 7-8 バイト目が major version
od -A n -t d -j 6 -N 2 MyClass.class
# 0  52  ← major version 52

対処方法

方法 1: JVM をアップグレード(推奨)

実行環境の Java を、クラスファイルのバージョン以上に上げます。

# Ubuntu/Debian
sudo apt install openjdk-11-jdk

# CentOS/RHEL
sudo yum install java-11-openjdk

# Mac (Homebrew)
brew install openjdk@11

# Windows
# https://adoptium.net/ から Java 11 LTS をダウンロード

複数バージョンが共存している場合は JAVA_HOMEPATH を切り替え:

# Linux/Mac
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH

# Windows
setx JAVA_HOME "C:\Program Files\Java\jdk-11"
setx PATH "%JAVA_HOME%\bin;%PATH%"

方法 2: 古いバージョン向けに再コンパイル

JVM のアップグレードができない場合、ソースを古いバージョン向けにコンパイルします。

# Java 7 互換でコンパイル
javac -source 1.7 -target 1.7 MyClass.java

# Maven の場合 (pom.xml)

  maven-compiler-plugin
  
    1.7
    1.7
  


# Gradle の場合 (build.gradle)
sourceCompatibility = 1.7
targetCompatibility = 1.7

方法 3: ライブラリの古いバージョンを使う

サードパーティライブラリで Java 8+ を要求するものを使っている場合、Java 7 互換の古いバージョンに戻す:

# pom.xml

  org.apache.commons
  commons-lang3
  3.5  

よくある発生シーン

  • 古い Tomcat / Glassfish に新しい WAR をデプロイ: サーバー側 JVM が古い
  • CI/CD のビルド環境とデプロイ先環境の JDK バージョンが異なる
  • サードパーティ jar が新しい Java で作られている: Maven 依存ライブラリを上げたら発生
  • 古いマシンに新しい IDE のプロジェクトを持ち込み
  • Android アプリで Java 8 機能を使った: minSdkVersion との互換性

関連エラー

  • UnsupportedClassVersionError: ... version 55.0 → Java 11 でコンパイル、Java 8 以前で実行
  • UnsupportedClassVersionError: ... version 61.0 → Java 17 でコンパイル、Java 11 以前で実行
  • NoClassDefFoundError → クラスは存在するがロード時にエラー(バージョン以外の原因も)
  • NoSuchMethodError → 同名メソッドのシグネチャ違い

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. java.lang.NoSuchMethodError
  2. java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
  3. java.lang.UnsupportedClassVersionError
  4. version less than X.X is not supported.
  5. パッケージ~は存在しません
  6. org.apache.jasper.JasperException: ...The jsp:param action must not be...
  7. java.io.FileNotFoundException: ファイル名 (許可がありません)
  8. java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
  9. 警告: この文字は、エンコーディング[文字コード]にマップできません
  10. java.text.ParseException: Unparseable date
  11. Unsupported major.minor version 52.0
  12. エンティティ" ... "への参照は';'デリミタで終了する必要があります。
  13. java.math.BigDecimal cannot be cast to java.lang.String