org.apache.tomcat.util.bcel.classfile.ClassFormatException: Ungültiges Byte-Tag im konstanten Pool: 15


81

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

Tomcat startet erfolgreich, aber im Protokoll catalina.outerhalte 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?


Sie benötigen Aspekt J 1.8, um Java 8-Unterstützung zu erhalten. stackoverflow.com/questions/23801950/…
— Anant Laxmikant Bobde

@AnantLaxmikantBobde Dies hängt nicht mit der Ursache dieses Problems zusammen, bei dem es sich um eine Bytecode-Inkompatibilität zwischen dieser bestimmten Version von Tomcat und dieser Version des JDK handelt. In dieser Antwort finden Sie die richtige Lösung.
— Vallismortis

Antworten:


86

Die "offizielle Antwort" lautet, dass Tomcat 7 unter Java 8 ausgeführt wird (siehe http://tomcat.apache.org/whichversion.html) ("Java Version 6 und höher").

Wenn jedoch das Scannen von Anmerkungen aktiviert ist (metadata-complete = "true" in web.xml), treten aufgrund von BCEL einige Probleme auf (die neuen Java 8-Byte-Codes können nicht verarbeitet werden). Sie erhalten Ausnahmen wie (zumindest mit 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 Sie das Scannen von Anmerkungen nicht verwenden, funktioniert ab Version 7.0.53 (aktualisierter Compiler mit besserer Java 8-Unterstützung) alles einwandfrei.

(UPDATE 2014.10.17) Wenn Ihr sind mit Annotation Scannen und Ihren eigenen Code ist nicht Java 8 basiert, ist eine andere Lösung die folgende Zeile in hinzufügen /etc/tomcat7/catalina.properties(Text nach „ant-launcher.jar“ hinzugefügt , so Teil der Immobilie 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.


Tomcat 7.054 unterstützt immer noch nicht das jdk8-Compiler-Flag, verwandte Frage auf stackoverflow.com/questions/25279729/…
— Gerrit Brink

1
Zur Verdeutlichung: Wenn metadata-complete = "true" in web.xml enthalten ist, sollte die Annotationsverarbeitung deaktiviert werden, oder?
— Christian K.

Wahrscheinlich ist der Kommentar veraltet, aber das Ändern des Kater von 7.0.23 auf 8.0.18 löst automatisch das Problem für mich [Windows 7]
— Yauhen

Das Ändern von tomcat.util.scan.DefaultJarScanner.jarsToSkip in Catalina.properties hat für Tomcat 8 für mich funktioniert. (Zumindest enthüllte es andere Probleme!)
— JGFMK

1
@SamuelThompson Siehe diese Antwort für die korrekte Korrektur für Tomcat 8.
— vallismortis

28

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

  • Kofferraum ab 9.0.0.M18
  • 8.5.x ab 8.5.12
  • 8.0.x ab 8.0.42
  • 7.0.x ab 7.0.76

2
Dies löste das Problem für mich (JDK 8 mit Tomcat 8.0.27 fehlgeschlagen)
— Pablo

1
Ich bekomme dieses Problem mit Tomcat 8.0.36 und log4j-api-2.11.0.jar
— stephan f

2
Dies löste das Problem. Aktualisieren Sie Ihre Tomcat-Version
— LFelix


2

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.


1

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


1

Für mich hat es funktioniert, indem ich die fraglichen Gläser aus dem Krieg entfernt habe. 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>

1
Unable to process Jar entry [module-info.class] from Jar [jar:file:/xxxxxxxx/lombok-1.18.4.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

1.Update und füge das folgende Argument in an <root or instance tomcat folder>/conf/catalina.properties

org.apache.catalina.startup.ContextConfig.jarsToSkip=...,lombok-1.18.4.jar

2. Reinigen und implementieren Sie das zu pulsende Projekt.


Ich musste zur Version 1.14.8 zurückkehren (AFAIK mit den gleichen Hauptmerkmalen, also keine große Sache hier)
— ATorras

0

Ich habe dieses Problem mit Tomcat 7 + JDK 1.8 konfrontiert

Mit Java 1.7 und niedrigeren Versionen funktioniert es einwandfrei.

Fenster -> Einstellungen -> Java -> Jre installiert

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

und ändern Sie die Projektfacette entsprechend. Wählen Sie dieselbe Java-Version aus, die sich in der ausgewählten installierten JRE befindet.


@AshishRatan Sehen Sie diese Antwort für die korrekte Korrektur für JDK 8.
— vallismortis

0

Ich habe einen ähnlichen Fehler (org.aspectj.apache.bcel.classfile.ClassFormatException: Ungültiges Byte-Tag im konstanten Pool: 15) bei Verwendung von Aspektj 1.8.13 erhalten. Die Lösung bestand darin, die gesamte Kompilierung in jdk 8 auszurichten und darauf zu achten, dass die anderen Versionen der Aspectj-Bibliothek (z. B. 1.6.13) nicht in buildpath / classpath abgelegt werden.


0

Ich hatte das gleiche Problem beim Ausführen meiner Spring-Boot-Anwendung mit tomcat7: run

Es gibt einen Fehler mit der folgenden Abhängigkeit in maven pom.xml:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
    </dependency>
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

Jul 09, 2020 1:28:09 PM org.apache.catalina.startup.ContextConfig processAnnotationsJar
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

Aber wenn ich es im Testbereich korrekt spezifiziere, gibt es keinen Fehler:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
    </dependency>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.