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
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
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.
"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
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.
Ü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
・ ・ ・ ・ ・ ・ ・ ・ ・
Überprüfen Sie also unbedingt Ihre Java-Version! Es war eine Geschichte. .. ..
Recommended Posts