it-swarm.com.de

org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: Ungültiger Byte-Tag im konstanten Pool: 15

Ich portiere eine Webapp von Tomcat 7 auf einen anderen Server mit Tomcat 7, aber mit Java 8.

Tomcat startet erfolgreich, aber in log catalina.out bekomme ich:

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)

Was könnte das Problem sein?

57
JackTurky

Die "offizielle Antwort" lautet, dass Tomcat 7 unter Java 8 läuft (siehe: __. http://Tomcat.Apache.org/whichversion.html ("Java-Version 6 und höher")).

Wenn jedoch das Annotations-Scanning aktiviert ist (Metadata-complete = "true" in web.xml), gibt es einige Probleme aufgrund von BCEL (die neuen Java 8-Bytecodes können nicht verarbeitet werden). Sie erhalten Ausnahmen wie (zumindest bei 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)

Wenn nicht mit Annotations-Scanning verwendet wird, funktioniert alles ab Release 7.0.53 (aktualisierter Compiler mit besserer Java 8-Unterstützung).

(UPDATE 2014-10-17) Wenn Ihr are Annotation Scanning verwendet und Ihr eigener Code nicht auf Java 8 basiert, können Sie die folgende Zeile in /etc/Tomcat7/catalina.properties hinzufügen (nach " ant-launcher.jar "so Teil der Eigenschaft Tomcat.util.scan.DefaultJarScanner.jarsToSkip):

junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar

Getestet mit Tomcat 7.0.28 und Oracle JDK 8_25 unter Debian 7.6.

64
rmuller

Dies war ein Tomcat-Fehler , der erneut mit dem Java 9-Bytecode aufgetaucht war. Die genauen Versionen, die dies beheben (für beide Java 8/9-Bytecodes), sind:

  • stamm für 9.0.0.M18 und mehr
  • 8.5.x für 8.5.12 und später
  • 8.0.x für 8.0.42 und höher
  • 7.0.x für 7.0.76 und höher
11
vallismortis

Aktualisieren Sie auf Tomcat 7.0.58 (oder neuer).

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

9
Saulo Silva

Dieses Problem tritt auf, weil Sie jre1.8.0_101-1.8.0_101-fcs.i58.rpm sowie jdk-1.7.0_80-fcs.x86_64.rpm installiert haben. Deinstallieren Sie einfach Ihre jre rpm und starten Sie Ihre Anwendung neu. Es sollte klappen.

2
C Karthickeyan

Für mich hat das Upgrade von bcel auf 6.0 das Problem behoben.

1
Cody

Bei mir hat es geklappt, indem die fraglichen Gläser aus dem Krieg gezogen wurden. Bei Maven musste ich zum Beispiel nur ausschließen

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

Ich habe einen ähnlichen Fehler erhalten (org.aspectj.Apache.bcel.classfile.ClassFormatException: Ungültiges Byte-Tag im konstanten Pool: 15), während ich asp1.1.1 verwendet. Die Lösung bestand darin, die gesamte Kompilierung in jdk 8 abzugleichen und darauf zu achten, dass andere Versionen der Seitenansichtj-Bibliothek (1.6.13) nicht in buildpath/classpath gespeichert werden.

0
yılmaz

Ich habe dieses Problem mit Tomcat 7 + jdk 1.8 konfrontiert

mit Java 1.7 und niedrigeren Versionen funktioniert es gut.

fenster -> Einstellungen -> Java -> Installierte JRE 

in meinem Fall habe ich jre1.8 zu JDK 1.7 geändert 

und ändern Sie entsprechend die Projektfacette, wählen Sie dieselbe Java-Version aus, wie sie in der ausgewählten installierten JRE vorhanden ist.

0
Neelam Chahal