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