[JAVA] UnsupportedClassVersionError wurde ausgegeben, als ich die mit Eclipse erstellte .war-Datei auf EC2 platzierte und ausführte.

Umgebung

Ausführungsumgebung

AWS EC2 t2.micro Amazon Linux 2 Apache Tomcat/9.0.34

# java -version
openjdk version "1.8.0_252-debug"
OpenJDK Runtime Environment (build 1.8.0_252-debug-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09-debug, mixed mode)

# javac -version
javac 1.8.0_252-debug

Build-Umgebung (lokale Umgebung)

Windows10 Eclipse 2020-03

Java-Version an der Windows-Eingabeaufforderung bestätigt

> java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

> javac -version
javac 1.8.0_231

Hintergrund

Erstellen Sie ein dynamisches Webprojekt "Beispiel" in Eclipse, um die Entwicklung von Webanwendungen zu untersuchen Ich habe eine Beispielanwendung "HealthCheck" mit Servlet & JSP erstellt. Bestätigen Sie den normalen Betrieb mit " http: // localhost: 8080 / example / HealthCheck "im Browser. Es funktioniert lokal.

Ich wollte es auf EC2 bereitstellen und prüfen, ob es funktioniert, also für jedes Projekt in Eclipse In .war-Datei exportieren und auf EC2 platzieren.

[root@ip-10-0-0-50 webapps]# ls -l /opt/apache-tomcat/webapps
total 24
drwxr-x--- 16 tomcat tomcat  4096 Apr 24 15:28 docs
drwxr-x---  5 tomcat tomcat   123 Jun  3 12:55 example
drwxr-x---  6 tomcat tomcat    83 Apr 24 15:28 examples
-rwxr-xr-x  1 tomcat tomcat 18910 Jun  3 12:55 example.war        ←★
drwxr-x---  5 tomcat tomcat    87 Apr 24 15:28 host-manager
drwxr-x---  5 tomcat tomcat   103 Apr 24 15:28 manager
drwxr-x---  3 tomcat tomcat   283 Apr 24 15:28 ROOT

[root@ip-10-0-0-50 webapps]# ls -l /opt/apache-tomcat/webapps/example
total 16
drwxr-x--- 2 tomcat tomcat  31 Jun  3 12:55 css
-rw-r----- 1 tomcat tomcat 761 May 27 00:08 Ex5_2.jsp
-rw-r----- 1 tomcat tomcat 493 May 26 23:31 formSample.jsp
-rw-r----- 1 tomcat tomcat 140 May 25 21:06 hello.html
drwxr-x--- 2 tomcat tomcat  44 Jun  3 12:55 META-INF
-rw-r----- 1 tomcat tomcat 670 May 26 18:38 sample.jsp
drwxr-x--- 5 tomcat tomcat  43 Jun  3 12:55 WEB-INF

Starten Sie tomcat.service neu und überprüfen Sie den Status

[root@ip-10-0-0-50 webapps]# systemctl status tomcat.service
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Wed 2020-06-03 13:12:27 UTC; 1h 4min ago
  Process: 4100 ExecStop=/opt/apache-tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 4129 ExecStart=/opt/apache-tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 4129 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           mq4144 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat/conf/loggin...

Jun 03 13:12:27 ip-10-0-0-50.ap-northeast-1.compute.internal systemd[1]: Starting Apache Tomca...
Jun 03 13:12:27 ip-10-0-0-50.ap-northeast-1.compute.internal systemd[1]: Started Apache Tomcat...
Hint: Some lines were ellipsized, use -l to show in full.

Ereignis auftreten

"500 - Interner Serverfehler" tritt auf, wenn eine Verbindung von einem Browser zu dem an EC2 angeschlossenen EIP hergestellt wird http://[EIP]:8080/example/HealthCheck


HTTP Status 500 - Interner Serverfehler

Typ: Ausnahmebericht Meldung: Fehler beim Instanziieren der Servlet-Klasse [servlet.HealthCheck] Beschreibung: Der Server hat einen unerwarteten Zustand festgestellt. Es verhindert, dass die Anforderung ausgeführt wird. Ausnahme:  javax.servlet.ServletException: Error instantiating servlet class [servlet.HealthCheck] (Weggelassen) Grundursache:  java.lang.UnsupportedClassVersionError: servlet/HealthCheck 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.HealthCheck]) (Weggelassen) Hinweis: Alle Ursachenstapelspuren werden auf dem Server protokolliert

Apache Tomcat/9.0.34

Umfrage

Liegt es am Unterschied in der Java-Version?

Dieser "UnsupportedClassVersionError" ist

Während die Java Virtual Machine eine Klassendatei liest, die Hauptversionsnummer dieser Datei und Wird ausgelöst, wenn festgestellt wird, dass die Nebenversionsnummer nicht unterstützt wird.

etwas wie.

Mit anderen Worten, es wird angenommen, dass die Ursache der Unterschied in der Java-Version zwischen der Build-Umgebung und der Ausführungsumgebung ist.

Wie zu Beginn unter "Umgebung" erwähnt, lautet die Javac-Version der Build-Umgebung "Javac 1.8.0_231" Die Java-Version der Ausführungsumgebung ist `openjdk version" 1.8.0_252-debug "` Weil es so ist, scheint es kein Problem zu geben ...

Überprüfen Sie die Version der kompilierten Klassendatei

[root@ip-10-0-0-50 webapps]# javap -v ./example/WEB-INF/classes/servlet/HealthCheck.class
Classfile /opt/apache-tomcat-9.0.34/webapps/example/WEB-INF/classes/servlet/HealthCheck.class
  Last modified Jun 4, 2020; size 1988 bytes
  MD5 checksum 83f908e6070439cc6281b73baae5306d
  Compiled from "HealthCheck.java"
public class servlet.HealthCheck extends javax.servlet.http.HttpServlet
  minor version: 0
  major version: 55                                   ←★
  flags: ACC_PUBLIC, ACC_SUPER

Die Hauptversion ist "55"! !!

Andererseits ist die JRE-Version der Ausführungsumgebung 1.8. Laut der Website von hier Die von JRE Version 1.8 unterstützte Klassendateiversion ist "52".

Ich konnte die Details des Fehlers verstehen.

Daher wurde die zu Beginn in der "Build-Umgebung" bestätigte Javac-Version für Windows als Ganzes bestätigt. Das Ergebnis (bestätigt durch cmd, das über das Startmenü geöffnet wurde) ist das Ergebnis des Projekts auf Eclipse Es stellte sich heraus, dass es anders war als in der "Eingabeaufforderung", die im Kontextmenü angezeigt wird.

>javac -version
javac 11.0.5

D:\31_Pleiades\workspace\example>java -version
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.5+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.5+10, mixed mode)

In diesem Zusammenhang ist die Javac-Version "11.0.5". Die Eclipse, die ich jetzt verwende, ist "Plejaden All in One Eclipse", und dieses Plug-In enthält mehrere Versionen des JDK.

Es gibt JDK1.8, das in Windows auf andere Weise eingeführt wurde, und da der Pfad dorthin führt, habe ich ihn in der Bestätigung am Anfang nicht bemerkt.

Der beim Erstellen mit Eclipse verwendete Javac war "11.0.5", daher trat dieses Problem auf. Wenn Sie die beim Erstellen verwendete Version von Javac auf "1.8" reduzieren können, scheint dieses Problem behoben zu sein.

Bewältigung

Versuchen Sie, die JDK-Version zur Erstellungszeit zu verringern

Überprüfen Sie zunächst die Einstellungen der gesamten Eclipse

Versuchen Sie, die Version als projektspezifische Einstellung zu verringern

Erstellen und überprüfen Sie die Version der Klassendatei neu

>javap -v HealthCheck.class
Classfile /D:/31_Pleiades/workspace/example/build/classes/servlet/HealthCheck.class
  Last modified 2020/06/04; size 1988 bytes
  MD5 checksum 5deb7a7fe4b855e66be9d06261116bd6
  Compiled from "HealthCheck.java"
public class servlet.HealthCheck extends javax.servlet.http.HttpServlet
  minor version: 0
  major version:52 ← ★ Erfolg
  flags: ACC_PUBLIC, ACC_SUPER

Erneut in .war-Datei exportieren → Server platzieren → Zugriff versuchen

・ ・ ・ ・ ・ ・ ・ ・ ・

Erfolg! !!

Überprüfen Sie also unbedingt Ihre Java-Version! Es war eine Geschichte. .. ..

Recommended Posts

UnsupportedClassVersionError wurde ausgegeben, als ich die mit Eclipse erstellte .war-Datei auf EC2 platzierte und ausführte.
Ich möchte eine Datei mit Ruby im Internet herunterladen und lokal speichern (mit Vorsicht).
Ich habe Docker auf EC2 installiert und gestartet
Wenn ich die Datei mit der Klasse # getResource aus der JAR-Datei aufrufe, wird sie nicht gefunden und ist ein beschissenes Memorandum
Ich habe die Menüleiste (Optionsmenü) unter Android geöffnet und gesehen.
Ich habe nachgesehen, weil die Antwort beim Debuggen mit Tomcat 8 seltsam war
Wenn ich die Eigenschaftendatei bearbeite, sieht es aus wie verstümmelte Zeichen
Probleme, denen ich beim Erstellen der Digdag-Umgebung mit Docker verfallen war
Beim Formatieren mit SimpleDateFormat blieb ich beim Umgang mit Zeitzonen