Je porte une application Web de Tomcat 7 sur un autre serveur avec Tomcat 7 mais avec Java 8.
Tomcat démarre correctement mais dans le journal catalina.out
, je reçois:
org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
at org.Apache.Tomcat.util.bcel.classfile.Constant.readConstant(Constant.Java:131)
at org.Apache.Tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.Java:60)
at org.Apache.Tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.Java:209)
at org.Apache.Tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.Java:119)
at org.Apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.Java:2049)
at org.Apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.Java:1931)
at org.Apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.Java:1899)
at org.Apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.Java:1885)
at org.Apache.catalina.startup.ContextConfig.webConfig(ContextConfig.Java:1281)
at org.Apache.catalina.startup.ContextConfig.configureStart(ContextConfig.Java:855)
at org.Apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.Java:346)
at org.Apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.Java:119)
at org.Apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.Java:90)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5172)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:899)
at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:875)
at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:618)
at org.Apache.catalina.startup.HostConfig.deployDirectory(HostConfig.Java:1100)
at org.Apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.Java:1618)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:511)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
at Java.lang.Thread.run(Thread.Java:745)
Quel pourrait être le problème?
La "réponse officielle" est que Tomcat 7 fonctionne sur Java 8, voir http://Tomcat.Apache.org/whichversion.html ("Java version 6 et ultérieure").
Toutefois, si l'analyse des annotations est activée (metadata-complete = "true" dans web.xml), certains problèmes sont dus à BCEL (impossibilité de traiter les nouveaux codes octets Java 8). Vous obtiendrez des exceptions comme (au moins avec Tomcat 7.0.28):
SEVERE: Unable to process Jar entry [jdk/nashorn/internal/objects/NativeString.class] from Jar [jar:file:/usr/lib/jvm/jdk1.8.0_5/jre/lib/ext/nashorn.jar!/] for annotations
org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
at org.Apache.Tomcat.util.bcel.classfile.Constant.readConstant(Constant.Java:131)
Si pas en utilisant le balayage des annotations, tout fonctionne correctement à partir de la version 7.0.53 (compilateur mis à jour avec une meilleure prise en charge de Java 8).
(UPDATE 2014-10-17) Si votre are utilise le balayage d'annotation et votre propre code n'est pas basé sur Java 8, une autre solution consiste à ajouter la ligne suivante dans /etc/Tomcat7/catalina.properties
( texte ajouté après "ant-launcher.jar", donc partie de la propriété Tomcat.util.scan.DefaultJarScanner.jarsToSkip
):
junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar
Testé avec Tomcat 7.0.28 et Oracle JDK 8_25 sur Debian 7.6.
Il s'agissait d'un bogue Tomcat qui a refait surface avec le bytecode Java 9. Les versions exactes qui corrigent cela (pour les deux bytecode Java 8/9) sont:
Mettez à jour vers Tomcat 7.0.58 (ou plus récent).
Voir: https://bz.Apache.org/bugzilla/show_bug.cgi?id=57173#c16
Ce problème se produit car vous avez également installé jre1.8.0_101-1.8.0_101-fcs.i58.rpm et jdk-1.7.0_80-fcs.x86_64.rpm. Alors, désinstallez votre jre rpm et redémarrez votre application. Ça devrait marcher.
Pour moi, la mise à niveau de bcel vers la version 6.0 a résolu le problème.
Pour moi, cela a fonctionné en retirant de la guerre les pots en question. Avec Maven, il me suffisait d'exclure par exemple
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
<exclusions>
<exclusion>
<groupId>com.Sun.istack</groupId>
<artifactId>istack-commons-runtime</artifactId>
</exclusion>
<exclusion>
<groupId>org.jvnet.staxex</groupId>
<artifactId>stax-ex</artifactId>
</exclusion>
<exclusion>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>txw2</artifactId>
</exclusion>
<exclusion>
<groupId>com.Sun.xml.fastinfoset</groupId>
<artifactId>FastInfoset</artifactId>
</exclusion>
</exclusions>
</dependency>
J'ai une erreur similaire (org.aspectj.Apache.bcel.classfile.ClassFormatException: Balise d'octet non valide dans le pool constant: 15) lors de l'utilisation d'aspectj 1.8.13. La solution consistait à aligner toute la compilation sur jdk 8 et à ne pas placer les autres versions de la bibliothèque Aspectj (1.6.13 par exemple) dans buildpath/classpath.
J'ai fait face à ce problème avec Tomcat 7 + jdk 1.8
avec Java 1.7 et les versions inférieures, cela fonctionne bien.
fenêtre -> préférences -> Java -> jre installé
dans mon cas, j'ai changé jre1.8 en JDK 1.7
et, en conséquence, modifiez la facette du projet, sélectionnez la même version de Java telle qu’elle existe dans le JRE installé.