#例外発生時の状況
Eclipseでサーブレットアプリを作成し、VPSにデプロイしたところ、以下のような例外が発生した。
javax.servlet.ServletException: Error instantiating servlet class [servlet.LoginServlet]
#原因
EclipseのJDKバージョンと、TomcatのJREバージョンが一致していないのが原因で、Tomcatがクラスファイルを実行できない状態になっていました。(コンパイル時のJavaバージョンが実行時のJavaバージョンを上回っていると、例外が発生するようです。)
<エラーログ>
根本原因
java.lang.UnsupportedClassVersionError:
servlet/LoginServlet has been compiled by a more recent version of the Java Runtime (class file version 55.0),
this version of the Java Runtime only recognizes class file versions up to 52.0 (unable to load class [servlet.LoginServlet])
~以下略~
※ ちなみに、クラスファイルのバージョンはJREのバージョンに対し、以下の様に対応しています。
JREバージョン | クラスファイルバージョン |
---|---|
Java 8 | 52.0 |
Java 9 | 53.0 |
Java 10 | 54.0 |
Java 11 | 55.0 |
Java 12 | 56.0 |
Java 13 | 57.0 |
Java 14 | 58.0 |
Java 15 | 59.0 |
今回のケースだと、アプリがバージョン55.0(Java 11)でコンパイルされているのにも関わらず、バージョン52.0(Java 8)で実行しようとしている、という状況になっていました。 |
#解決策
Tomcat側のバージョンを最新にするか、Eclipse側のバージョンを下げる。(今回はEclipse側を変更することにした。)
Eclipseウインドウからウィンドウ > 設定
と遷移すると設定画面が表示される。Java > コンパイラー
ページへ遷移すると、JDKのコンパイラー準拠レベル
という項目があるので、こちらを1.8
に変更する。
※ 既にプロジェクトを作成している場合、この設定変更は適用されない。作成済みのプロジェクトのバージョンを落としたい場合は、プロジェクト名(右クリック) > プロパティ
で同じ画面が表示されるので、そちらで変更する。
#参考
https://stackoverflow.com/questions/47457105/class-has-been-compiled-by-a-more-recent-version-of-the-java-environment
http://www.ne.jp/asahi/hishidama/home/tech/java/version.html
https://jpn.itlibra.com/article?id=21118