org.apache.tomcat.util.bcel.classfile.ClassFormatException: Nieprawidłowy tag bajtowy w stałej puli: 15

83

Przenoszę aplikację internetową z Tomcat 7 na inny serwer z Tomcat 7, ale z Javą 8.

Tomcat uruchamia się pomyślnie, ale w dzienniku catalina.outotrzymuję:

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)

Jaki może być problem?

JackTurky
źródło
Aby uzyskać obsługę Java 8, potrzebujesz aspektuJ 1.8. stackoverflow.com/questions/23801950/…
Anant Laxmikant Bobde
@AnantLaxmikantBobde To nie ma związku z przyczyną tego problemu, którym jest niezgodność kodu bajtowego między tą konkretną wersją Tomcata a tą wersją JDK. Zobacz tę odpowiedź, aby uzyskać poprawną poprawkę.
vallismortis

Odpowiedzi:

86

„Oficjalna odpowiedź” jest taka, że ​​Tomcat 7 działa na Javie 8, patrz http://tomcat.apache.org/whichversion.html („Java w wersji 6 i nowszych”).

Jeśli jednak włączone jest skanowanie adnotacji (metadata-complete = "true" w pliku web.xml), występują pewne problemy wynikające z BCEL (niemożność przetworzenia nowych 8-bajtowych kodów Java). Otrzymasz wyjątki, takie jak (przynajmniej z 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)

Jeśli nie używasz skanowania adnotacji, wszystko działa dobrze, począwszy od wersji 7.0.53 (zaktualizowany kompilator z lepszą obsługą Java 8).

(Aktualizacja 17.10.2014) Jeśli Twój przy użyciu skanowania adnotacji i własny kod Java 8 nie jest oparta, innym rozwiązaniem jest dodanie następującej linii w /etc/tomcat7/catalina.properties(tekst dodaje się po „mrówek” tak launcher.jar części majątku tomcat.util.scan.DefaultJarScanner.jarsToSkip):

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

Testowane z Tomcat 7.0.28 i Oracle JDK 8_25 w systemie Debian 7.6.

rmuller
źródło
Tomcat 7.054 nadal nie obsługuje flagi jdk8 -compiler, powiązane pytanie na stackoverflow.com/questions/25279729/ ...
Gerrit Brink
1
Dla wyjaśnienia: jeśli metadata-complete = "true" znajduje się w pliku web.xml, przetwarzanie adnotacji powinno być wyłączone, prawda?
Christian K.
Prawdopodobnie komentarz jest nieaktualny, ale zmiana tomcata z 7.0.23 na 8.0.18 automatycznie rozwiązuje problem dla mnie [Windows 7]
Yauhen
Modyfikacja tomcat.util.scan.DefaultJarScanner.jarsToSkip w ramach catalina.properties działała dla Tomcat 8. (Przynajmniej ujawniło inne problemy!)
JGFMK
1
@SamuelThompson Zobacz tę odpowiedź, aby uzyskać poprawną poprawkę dla Tomcat 8.
vallismortis
30

To był błąd Tomcata, który pojawił się ponownie wraz z kodem bajtowym Java 9. Dokładne wersje, które to naprawiają (dla obu kodu bajtowego Java 8/9) to:

  • bagażnik od wersji 9.0.0.M18
  • 8.5.x od wersji 8.5.12
  • 8.0.x dla wersji 8.0.42 i nowszych
  • 7.0.x od wersji 7.0.76
vallismortis
źródło
2
To rozwiązało problem dla mnie (JDK 8 z Tomcat 8.0.27 nie powiodło się)
pablo
1
Mam ten problem z tomcat 8.0.36 i log4j-api-2.11.0.jar
stephan f
2
To rozwiązało problem. Zaktualizuj wersję Tomcata
LFelix,
8

Zaktualizuj do Tomcat 7.0.58 (lub nowszej).

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

Poprawa wydajności, która wywołała tę regresję, została cofnięta z wersji trunk, 8.0.x (od wersji 8.0.16) i 7.0.x (od wersji 7.0.58) i nie zostanie zastosowana ponownie.

Saulo Silva
źródło
2
Nie znalazłem żadnego związku z java 8 w tym linku.
Michael_S
2

Ten problem występuje, ponieważ zainstalowano jre1.8.0_101-1.8.0_101-fcs.i58.rpm, a także jdk-1.7.0_80-fcs.x86_64.rpm. więc po prostu odinstaluj swój jre rpm i uruchom ponownie aplikację. Powinno się udać.

C Karthickeyan
źródło
1

Dla mnie aktualizacja bcel do wersji 6.0 rozwiązała problem.

Cody
źródło
1

U mnie to zadziałało, usuwając te słoiki z wojny. W przypadku Mavena po prostu musiałem na przykład wykluczyć

    <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
źródło
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. zaktualizuj i dołącz poniższy argument w <root or instance tomcat folder>/conf/catalina.properties

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

2. oczyścić i wdrożyć projekt, który ma być gotowy.

K. Andy wang
źródło
Musiałem wrócić do wersji 1.14.8 (AFAIK z tymi samymi głównymi funkcjami, więc nie ma
sprawy
0

Napotkałem ten problem z tomcat 7 + jdk 1.8

z java 1.7 i niższymi wersjami działa dobrze.

okno -> preferencje -> java -> zainstalowany jre

w moim przypadku zmieniłem jre1.8 na JDK 1.7

i odpowiednio zmodyfikuj aspekt projektu, wybierz tę samą wersję java, jaka jest w wybranym zainstalowanym środowisku JRE.

Neelam Chahal
źródło
@AshishRatan Zobacz tę odpowiedź, aby znaleźć poprawną poprawkę dla JDK 8.
vallismortis
0

Wystąpił podobny błąd (org.aspectj.apache.bcel.classfile.ClassFormatException: Invalid bajt tag w stałej puli: 15) podczas korzystania z aspektu 1.8.13. Rozwiązaniem było wyrównywanie całej kompilacji do jdk 8 i uważanie, aby nie umieszczać innych wersji biblioteki aspektuj (na przykład 1.6.13) w buildpath / classpath.

yılmaz
źródło
0

Miałem ten sam problem podczas uruchamiania aplikacji do rozruchu wiosennego z tomcat7: run

Daje błąd z następującą zależnością w 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

Ale kiedy poprawnie określę to w zakresie testowym, nie daje błędu:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
    </dependency>
ozkansari
źródło