java.lang.UnsupportedClassVersionError
実行時に
Got an exception - java.lang.UnsupportedClassVersionError: (エラーが発生したクラスのパス) (Unsupported major.minor version 48.0)
という例外が発生した場合、原因は開発環境と実行環境とのバージョンの違いである。実行環境のバージョンが開発環境よりも古い場合にこの例外が発生する。
この例では、(Unsupported major.minor version 48.0) と表示されているので JDK1.4 以上の環境でコンパイルされたモジュールを JDK1.3 以前の環境で実行した事が分かる。
実行環境のバージョンを調べるには
java -version
を実行すればよい。
一方、開発環境のバージョンを調べる場合、開発環境が手元のあるのであればコンパイラのバージョンを調べればよい。コンパイラのバージョンは
javac -J-version
で表示される。
開発環境が手元に無い、または別の環境でコンパイルされている場合は、class ファイルのバージョンを調べなければならない。
Unix 系のコマンドが使える環境であれば、file コマンドを利用するのが手っ取り早い。
$ file xxx.class xxx.class: compiled Java class data, version 48.0
class ファイルがどのバージョンの java に準拠してコンパイルされているかは、class ファイルの先頭 8 バイトを見れば分かる。
class ファイルの 先頭 4 バイトは「CA FE BA BE」で固定である。続く、5 〜 6 バイトがマイナーバージョン、7 〜 8 バイトがメジャーバージョンを表している。
ある class ファイルの先頭が以下だった場合、
CA FE BA BE 00 00 00 30
JDK1.4 に準拠してコンパイルされた事が分かる。
java のバージョンとバージョン番号との対応は以下の通り。
1.1 = 45.3
1.2 = 46.0
1.3 = 47.0
1.4 = 48.0
1.5 = 49.0
1.6 = 50.0