org.apache.tomcat.util.bcel.classfile.ClassFormatException: balise d’octet invalide dans le pool constant: 15

Je porte une application Web de Tomcat 7 sur un autre serveur avec Tomcat 7 mais avec Java 8.

Tomcat démarre avec succès mais dans log catalina.out j’obtiens:

 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.(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 s’exécute sur Java 8, voir http://tomcat.apache.org/whichversion.html (“Java version 6 et ultérieure”).

Cependant, si l’parsing des annotations est activée (metadata-complete = “true” dans web.xml), il existe des problèmes liés à BCEL (impossible de traiter les nouveaux codes Java 8 octets). Vous obtiendrez des exceptions comme (au moins avec Tomcat 7.0.28):

 SEVERE: Unable to process Jar entry [jdk/nashorn/internal/objects/NativeSsortingng.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 vous n’utilisez pas l’ parsing d’annotation, tout fonctionne correctement, à partir de la version 7.0.53 (compilateur mis à jour avec un meilleur support Java 8).

(MISE À JOUR 2014-10-17) Si vous utilisez l’parsing d’annotation et que votre propre code n’est pas basé sur Java 8, une autre solution consiste à append la ligne suivante dans /etc/tomcat7/catalina.properties (texte ajouté après «ant-launcher»). jar “fait 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.

Mettre à jour vers Tomcat 7.0.58 (ou plus récent).

Voir: https://bz.apache.org/bugzilla/show_bug.cgi?id=57173#c16

C’était un bug de Tomcat qui a refait surface avec le bytecode Java 9. Les versions exactes qui corrigent cela (à la fois pour le bytecode Java 8/9) sont les suivantes:

  • tronc pour 9.0.0.M18
  • 8.5.x pour 8.5.12
  • 8.0.x pour 8.0.42 et suivants
  • 7.0.x pour 7.0.76

Ce problème se produit car vous avez également installé jre1.8.0_101-1.8.0_101-fcs.i58.rpm jdk-1.7.0_80-fcs.x86_64.rpm. il suffit donc de désinstaller votre jre rpm & redémarrer votre application. Ça devrait marcher.

Pour moi, la mise à niveau de bcel vers 6.0 a résolu le problème.

J’ai rencontré ce problème avec tomcat 7 + jdk 1.8

avec java 1.7 et versions inférieures, ça marche bien.

window -> preferences -> java -> installé jre

dans mon cas j’ai changé jre1.8 en JDK 1.7

et modifiez en conséquence la facette du projet, sélectionnez la même version Java que celle qui existe dans le JRE installé sélectionné.

J’ai eu une erreur similaire (org.aspectj.apache.bcel.classfile.ClassFormatException: balise d’octet invalide 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 à faire attention à ne pas placer d’autres versions de aspectj library (1.6.13 par exemple) dans buildpath / classpath.