| この記事の要点 |
|
エラー内容
実行する Java のバージョンによって、メッセージの形が 2 種類あります。
# 古い Java(Java 8 以前)で実行した場合
java.lang.UnsupportedClassVersionError: com/example/Main : Unsupported major.minor version 55.0
# 新しい Java で実行した場合
java.lang.UnsupportedClassVersionError: com/example/Main has been compiled by a more recent version
of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes
class file versions up to 61.0
どちらも意味は同じで、「このクラスは自分より新しい Java 向けに作られているので読み込めない」という意味です。Web アプリでは、jar や war をサーバーにデプロイしてアクセスしたとき、またはアプリの起動時に発生します。
原因: コンパイルした Java と実行する Java のバージョン違い
Java のソースを javac でコンパイルすると、.class ファイルの先頭に「クラスファイルのバージョン(major version)」が書き込まれます。JVM は自分が対応しているバージョンより大きい番号のクラスを読み込めないため、このエラーで停止します。
つまり、サーバーの JRE のバージョンより新しいバージョンでビルドした jar をデプロイすると起きるエラーです。逆に、古い Java でコンパイルしたクラスを新しい Java で動かすのは基本的に問題ありません。
エラー中の数字と Java バージョンの対応表
| class file version | Java バージョン | 備考 |
|---|---|---|
| 50 | Java 6 | |
| 51 | Java 7 | |
| 52 | Java 8 | LTS。古いサーバーで今も多い |
| 55 | Java 11 | LTS |
| 61 | Java 17 | LTS。Spring Boot 3 系の最低要件 |
| 65 | Java 21 | LTS |
| 69 | Java 25 | LTS(2025 年 9 月リリース) |
規則は「Java のバージョン + 44 = class file version」です。たとえば「class file version 61.0 … only recognizes up to 52.0」なら、Java 17 でビルドしたものを Java 8 で動かそうとしている、と読めます。
対処法 1: 実行側の Java を新しくする
ビルドに使った Java と同じか、それより新しい Java で実行すれば解決します。ライブラリやフレームワークが新しい Java を前提にしている場合(例: Spring Boot 3 は Java 17 以上が必要)は、この方法しかありません。
- コマンドラインのアプリ:
JAVA_HOMEとPATHを新しい JDK に向ける - Tomcat:
JAVA_HOMEまたはJRE_HOME(bin/setenv.shなどで設定)を新しい Java に変える - Docker: ベースイメージを
eclipse-temurin:21-jreのように合ったバージョンにする
対処法 2: ビルド時のターゲットを下げる
サーバーの Java を変えられない場合は、古い Java 向けにコンパイルします。JDK 9 以降の --release オプションを使うと、クラスファイルのバージョンと使える標準 API の両方を指定バージョンに合わせてくれます。
# Java 21 の JDK で、Java 8 で動くクラスを作る
javac --release 8 -d out src/com/example/Main.java
Maven では pom.xml に次のように書きます(maven-compiler-plugin 3.6 以降で有効)。
<properties>
<maven.compiler.release>11</maven.compiler.release>
</properties>
Gradle ではツールチェーンか options.release で指定します。
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
// または
tasks.withType(JavaCompile).configureEach {
options.release = 11
}
Eclipse では、プロジェクトのプロパティ →「Java コンパイラー」の「コンパイラー準拠レベル」を実行環境に合わせます。IntelliJ IDEA では Project Structure の SDK と Language level、Maven / Gradle 側の設定を揃えます。
注意点として、-source / -target だけを下げる古い方法では、新しい Java にしかない API を使ってもコンパイルが通ってしまい、実行時に NoSuchMethodError になることがあります。可能な限り --release を使ってください。
よくある落とし穴
- java と javac のバージョンが違う: PATH 上に複数の JDK があり、
javacは 21、javaは 8 を指している - IDE は動くのにサーバーで落ちる: IDE 内蔵の JDK でビルドし、サーバーは古い JRE で動いている
- 依存ライブラリが新しい: 自分のコードを
--release 8にしても、依存 jar が Java 11 以上向けだとそのライブラリのクラスで同じエラーになる。ライブラリのバージョンを下げるか、実行環境を上げる - Maven 自体を動かす JDK:
mvn -vに表示される Java が、想定した JDK と違うことがある - CI とローカルの差: CI のビルドイメージの JDK が更新され、気づかないうちにターゲットが上がる
確認方法
# 実行側の Java バージョン
java -version
# コンパイラのバージョン
javac -version
# クラスファイルのバージョンを確認(major version: 61 なら Java 17)
javap -v com/example/Main.class | grep major
# jar の中のクラスを確認する場合
unzip -o app.jar com/example/Main.class -d /tmp/chk
javap -v /tmp/chk/com/example/Main.class | grep major
Windows のコマンドプロンプトでは grep の代わりに findstr major を使います。javap が示す major version が、実行側の Java が対応する番号(上の表)以下になっていれば解決です。
関連
- UnsupportedClassVersionError「class file version 61.0」の原因と対処
- 【Java】Javaのバージョン確認方法
- 【Tomcat / Mac編】Java(JRE_HOME)のバージョン変更方法
- Maven「Fatal error compiling: 1.X は無効なターゲット・リリース」原因と対処
- Java 開発環境構築完全ガイド — JDK/IDE/Maven/Gradle (2026 年版)
子ページはありません
- java.lang.NoSuchMethodError
- java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
- java.lang.UnsupportedClassVersionError
- version less than X.X is not supported.
- パッケージ~は存在しません
- org.apache.jasper.JasperException: ...The jsp:param action must not be...
- java.io.FileNotFoundException: ファイル名 (許可がありません)
- java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
- 警告: この文字は、エンコーディング[文字コード]にマップできません
- java.text.ParseException: Unparseable date
- Unsupported major.minor version 52.0
- エンティティ" ... "への参照は';'デリミタで終了する必要があります。
- java.math.BigDecimal cannot be cast to java.lang.String
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09