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.