[JAVA] UnsupportedClassVersionError a été généré lorsque j'ai placé le fichier .war construit avec Eclipse sur EC2 et l'ai exécuté.

environnement

Environnement d'exécution

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

Environnement de construction (environnement local)

Windows10 Eclipse 2020-03

Version Java confirmée à l'invite de commande Windows

> 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

Contexte

Créer un "exemple" de projet Web dynamique sur Eclipse pour étudier le développement d'applications Web J'ai créé un exemple d'application "HealthCheck" avec Servlet & JSP. Confirmez le fonctionnement normal avec " http: // localhost: 8080 / example / HealthCheck "du navigateur. Cela fonctionne localement.

Je voulais le déployer sur EC2 et voir si cela fonctionne, donc pour chaque projet sur Eclipse Exporter dans un fichier .war et placer sur EC2.

[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

Redémarrez tomcat.service et vérifiez l'état

[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.

Événement d'occurrence

"500 - Erreur de serveur interne" se produit lors de la connexion d'un navigateur à l'EIP attaché à EC2 http://[EIP]:8080/example/HealthCheck


État HTTP 500 - Erreur de serveur interne

Type: rapport d'exception Message: Erreur lors de l'instanciation de la classe de servlet [servlet.HealthCheck] Description: le serveur a rencontré une condition inattendue. Il empêche la demande d'être exécutée. Exception:  javax.servlet.ServletException: Error instantiating servlet class [servlet.HealthCheck] (Omis) Cause fondamentale:  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]) (Omis) Remarque: toutes les traces de pile de cause sont enregistrées sur le serveur

Apache Tomcat/9.0.34

Enquête

Est-ce dû à une différence de version de Java?

Cette "UnsupportedClassVersionError" est

Pendant que la machine virtuelle Java lit un fichier de classe, le numéro de version majeur de ce fichier et Lancé s'il détermine que le numéro de version mineure n'est pas pris en charge.

quelque chose comme.

En d'autres termes, on pense que la cause est la différence de version de Java entre l'environnement de construction et l'environnement d'exécution.

Comme mentionné dans "Environnement" au début, la version javac de l'environnement de construction est javac 1.8.0_231 La version java de l'environnement d'exécution estopenjdk version "1.8.0_252-debug" `` ` Parce que c'est le cas, il ne semble y avoir aucun problème ...

Vérifiez la version du fichier de classe compilé

[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

La version majeure est "55"! !!

En revanche, la version JRE de l'environnement d'exécution est la 1.8. Selon le site de ici La version du fichier de classe prise en charge par JRE version 1.8 est "52".

J'ai pu comprendre les détails de l'erreur.

Ainsi, la version Javac confirmée dans le "Build environment" au début a été confirmée pour Windows dans son ensemble. Le résultat (confirmé par cmd ouvert depuis le menu démarrer), qui est le résultat du projet sur Eclipse Il s'est avéré que c'était différent de ce que vous pouvez voir dans "l'invite de commande" qui apparaît dans le menu contextuel.

>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)

En regardant cela, la version javac est "11.0.5". L'Eclipse que j'utilise maintenant est "Pleiades All in One Eclipse", et ce plug-in contient plusieurs versions du JDK.

Il y a JDK1.8 qui a été introduit d'une autre manière dans Windows, et comme le chemin y va, je ne l'ai pas remarqué dans la confirmation au début.

Le javac utilisé lors de la construction avec Eclipse était "11.0.5", donc ce problème s'est produit. Si vous pouvez réduire la version de javac utilisée lors de la construction à "1.8", ce problème semble être résolu.

Faire face

Essayez de réduire la version JDK au moment de la construction

Tout d'abord, vérifiez les paramètres de l'ensemble de l'Eclipse

Essayez de réduire la version en tant que paramètre spécifique au projet

Reconstruire et vérifier la version du fichier de classe

>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 ← ★ Succès
  flags: ACC_PUBLIC, ACC_SUPER

Exporter à nouveau vers le fichier .war → Placer le serveur → Essayer d'accéder

・ ・ ・ ・ ・ ・ ・ ・ ・

Succès! !!

Assurez-vous donc de vérifier votre version Java! C'était une histoire. .. ..

Recommended Posts

UnsupportedClassVersionError a été généré lorsque j'ai placé le fichier .war construit avec Eclipse sur EC2 et l'ai exécuté.
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
J'ai installé Docker sur EC2 et l'ai démarré
Lorsque j'appelle le fichier avec la classe # getResource à partir du fichier jar, il devient Not Found et c'est un mémorandum merdique
J'ai ouvert la barre de menu (menu d'options) sur Android et l'ai vue.
J'ai vérifié car la réponse était étrange lors du débogage avec Tomcat 8
Lorsque j'édite le fichier de propriétés, il ressemble à des caractères déformés
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
J'étais coincé avec la gestion des fuseaux horaires lors du formatage avec SimpleDateFormat