[Java] 94 classファイルのJDKバージョン確認(逆コンパイル)

VSCodeが親切にも自動コンパイルして生成してくれたclassファイル。ビルドして得られたjarファイルが実行できないという事態が発生しました。
エラー内容はJava.lang.UnsupportedClassVersionErrorです。

VSCodeが使っているJDKのバージョンを確認しようとコマンドパレットからConfigure Java Runtimeを見ると設定画面がクラッシュしていました。

仕方ないので以下コマンドでclassファイルを逆コンパイルし、コンパイラのJDKバージョンを調べました。

javap -v classファイル名 | grep "version"
--------------------------------------------------
出力
--------------------------------------------------
minor version: 65535
major version: 61

一方、問題なくビルドできたclassファイルの逆コンパイル結果は以下の通りです。

minor version: 0
major version: 61

どちらもメジャーバージョンは17 (61マイナス44)で同じでしたが、マイナーバージョンが違っていました。

Macに入れているJDKの内容からVSCodeが使っているJDKはEclipse Temurin 17であることが判明しました。
*2022/1/30追記 ver 17.65535はTemurin版ではなくプレビュー機能で作成されたclassファイルのバージョン番号でした。つまりbinフォルダに自動生成されるclassファイルは元から正常なビルドができないということになります。確認すると実行コマンドのオプションが”–enable-preview”になっていました。テストで作成されたclassファイルを誤ってビルドに使わないための機能と理解しました。

VSCodeのConfigure Java Runtime設定がクラッシュしていなければ、もっと早く原因を突き止められたでしょう。

# MacにインストールしたJDKのリスト出力
/usr/libexec/java_home -V
--------------------------------------------------
出力
--------------------------------------------------
Matching Java Virtual Machines (4):
    17.0.1 (arm64) "Oracle Corporation" - "Java SE 17.0.1" /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home
    17.0.1 (x86_64) "Eclipse Temurin" - "Eclipse Temurin 17" /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
    1.8.321.07 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_302 (x86_64) "Eclipse Temurin" - "Eclipse Temurin 8" /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home

最近VSCodeには変数やメソッドのスコープ(修飾子)やライブラリのimportだけチェックしてもらい、コンパイルから先はターミナルで操作しています。拡張機能によるコンパイル&ビルド&実行は思う様に動いてくれないことが多々あるため使わなくなりました。