web-dev-qa-db-fra.com

org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: Balise d'octet non valide 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 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?

57
JackTurky

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.

64
rmuller

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:

  • coffre pour les versions 9.0.0.M18 et suivantes
  • 8.5.x à partir de 8.5.12
  • 8.0.x à partir de 8.0.42
  • 7.0.x à partir de 7.0.76
11
vallismortis

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

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

9
Saulo Silva

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.

2
C Karthickeyan

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

1
Cody

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

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.

0
yılmaz

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

0
Neelam Chahal