テクノロジー · 実用ガイド

UnsupportedClassVersionError?Java を変える前に class と loading JVM を証明する

エラーは互換性不一致の両端を示します。class major、artifact、実際の launcher を保存し、runtime を上げるか build を retarget するか選び、古い出力を消して local・CI・production 相当の同じ entrypoint で確認します。

Java class-file と runtime 境界図
オリジナルイラスト:拒否 artifact と実際に load する JVM を対応させます。 Watch at Ease

エラーは互換性不一致の両端を示します。class major、artifact、実際の launcher を保存し、runtime を上げるか build を retarget するか選び、古い出力を消して local・CI・production 相当の同じ entrypoint で確認します。

JVM は対応する class-file version だけを読み込み、より高い major はアプリ実行前に拒否します。 Java 8 から Java 25 は class-file major 52 から 69 に対応します。

1. 正確な不一致を固定する

最初の UnsupportedClassVersionError 全文、拒否 class、報告 class-file version、認識上限、launcher command、時刻を保存します。後で開いた別 shell ではなく失敗 context の java -version と javac -version を記録します。

JVM 仕様で major を対応付けますが表だけで終えません。通常の major mismatch と minor 65535 の preview mismatch は要件が違うため、表示されるなら両方保存します。

2. 拒否された artifact を特定する

最初の stack frame が示す .class または JAR を特定し、path、hash、package 座標または image digest、build provenance を記録します。可能なら抽出 class に javap -verbose を使い、実行せず major を確認します。

拒否 class が application、build plugin、annotation processor、IDE helper、transitive dependency のどれかを判定します。application target の変更で既成 third-party bytecode は変わりません。

3. 実際の loading runtime を証明する

実際に class を load する process を追い、解決済み java path、command line、JAVA_HOME/toolchain、working directory、container image を記録します。service は unit、CI は runner step、IDE/daemon は再起動後の設定を確認します。

login shell の which java だけを証拠にしません。wrapper、SDK manager、symlink、daemon reuse、PATH 順序、container layer が別 JVM を選べます。

4. 互換方向を一つ選ぶ

新 bytecode が必要で dependency も対応するなら、所有 launcher の runtime を上げて support window を確認します。developer shell だけでなく service、CI image、IDE、container を変更し persistent daemon を再起動します。

古い runtime を維持するなら --release 等で管理下コードを retarget し、互換 bytecode の dependency/plugin version を選びます。class header 改変や source compatibility の推測は使いません。

5. 古い混在出力を除く

新しい class を残す output、cache、package を削除または隔離します。選定 toolchain で clean build し artifact hash を記録、application・generated・dependency class を代表確認します。

multi-module では一部 module、生成 task、plugin が別 JDK を使えます。compile 成功だけでなく build log、toolchain 選択、最終 package を証明します。

6. すべての実入口で検証する

同じ artifact hash を必要な shell、IDE/build tool、CI、service、production 相当 container で実行します。最初の class が load され、test が通り、後続の不互換 class がないことを要求します。

launcher、java path、runtime version、artifact hash、class major、結果、rollback の受入表を残します。build と loader を同じ policy が支配して初めて完了です。

Java 互換修復マトリクス
オリジナルイラスト:runtime 更新か build retarget を選び両方検証します。 Watch at Ease