LoginSignup
6
4

More than 3 years have passed since last update.

Javaアプリデプロイ時の例外「ServletException: Error instantiating servlet class」の原因と対応策

Last updated at Posted at 2020-10-09

例外発生時の状況

Eclipseでサーブレットアプリを作成し、VPSにデプロイしたところ、以下のような例外が発生した。

javax.servlet.ServletException: Error instantiating servlet class [servlet.LoginServlet]

error.png

原因

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に変更する。
eclipse設定.png
 
※ 既にプロジェクトを作成している場合、この設定変更は適用されない。作成済みのプロジェクトのバージョンを落としたい場合は、プロジェクト名(右クリック) > プロパティで同じ画面が表示されるので、そちらで変更する。

参考

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

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4