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?

JackTurky
quelle
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.

Müller
quelle
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
vallismortis
quelle
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
8

Update auf Tomcat 7.0.58 (oder neuer).

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

Die Leistungsverbesserung, die diese Regression ausgelöst hat, wurde von Trunk 8.0.x (ab 8.0.16) und 7.0.x (ab 7.0.58) zurückgesetzt und wird nicht erneut angewendet.

Saulo Silva
quelle
2
Ich habe in diesem Link keine Beziehung zu Java 8 gefunden.
Michael_S
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.

C Karthickeyan
quelle
1

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

Cody
quelle
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>
Andreas Panagiotidis
quelle
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.

K. Andy Wang
quelle
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.

Neelam Chahal
quelle
@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.

yılmaz
quelle
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>
Ozkansari
quelle