org.apache.tomcat.util.bcel.classfile.ClassFormatException:常量池中的无效字节标记:15


81

我正在将Web应用程序从Tomcat 7移植到具有Tomcat 7但具有Java 8的另一台服务器。

Tomcat成功启动,但是在日志中catalina.out我得到:

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)

可能是什么问题呢?


您需要AspectJ 1.8才能获得Java 8支持。stackoverflow.com/questions/23801950/...
阿南特Laxmikant Bobde

@AnantLaxmikantBobde与此问题的原因无关,后者是该特定版本的Tomcat与该版本的JDK之间的字节码不兼容。请参阅此答案以获取正确的解决方案。
vallismortis

Answers:


86

“正式答案”是Tomcat 7在Java 8上运行,请参见 http://tomcat.apache.org/whichversion.html(“Java 6及更高版本”)。

但是,如果启用了注释扫描(web.xml中的metadata-complete =“ true”),则由于BCEL(无法处理新的Java 8字节代码)而会出现一些问题。您将获得类似的异常(至少对于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)

如果使用注释扫描,则从版本7.0.53(具有更好的Java 8支持的更新的编译器)开始,一切正常。

(更新2014年10月17日)如果您正在使用的注释扫描自己的代码是不是Java 8为主,另一种解决方案是添加以下行/etc/tomcat7/catalina.properties(“蚂蚁launcher.jar”之后添加文本,以便物业部分tomcat.util.scan.DefaultJarScanner.jarsToSkip):

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

在Debian 7.6上使用Tomcat 7.0.28和Oracle JDK 8_25进行了测试。


Tomcat 7.054仍然不支持jdk8 -compiler标志,有关stackoverflow.com/questions/25279729/…的
Gerrit Brink

1
需要说明的是:如果web.xml中的metadata-complete =“ true”处于禁用状态,对吧?
Christian K.

注释可能已过时,但是将tomcat从7.0.23更改为8.0.18可以自动为我解决问题[Windows 7]
Yauhen

在catalina.properties中修改tomcat.util.scan.DefaultJarScanner.jarsToSkip对我来说适用于Tomcat 8。(至少它揭示了其他问题!)
JGFMK

1
@SamuelThompson查看此答案以获取针对Tomcat 8的正确修复
。– vallismortis

28

这是一个Tomcat错误,再次使用Java 9字节码重新出现。解决此问题的确切版本(对于Java 8/9字节码)是:

  • 9.0.0.M18及以上的后备箱
  • 8.5.x及以上的8.5.12
  • 8.0.x及以上的8.0.42版本
  • 7.0.x以上为7.0.76版

2
这为我解决了问题(带有Tomcat 8.0.27的JDK 8失败)
pablo

1
我用tomcat 8.0.36和log4j-api-2.11.0.jar遇到了这个问题
stephan f

2
这样就解决了问题。更新您的Tomcat版本
LFelix '19


2

发生此问题的原因是,您已经安装了jre1.8.0_101-1.8.0_101-fcs.i58.rpm以及jdk-1.7.0_80-fcs.x86_64.rpm。因此,只需卸载jre rpm并重新启动应用程序即可。它应该解决。


1

对我来说,将bcel升级到6.0可以解决此问题。


1

对我而言,它可以通过从战争中移出相关的广口瓶来发挥作用。使用Maven,我只需要排除例如

    <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.更新并追加以下参数 <root or instance tomcat folder>/conf/catalina.properties

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

2.清理并部署要完成的项目。


我不得不恢复到1.14.8版本(AFAIK具有相同的主要功能,因此在这里没什么大不了的)
ATorras

0

我在tomcat 7 + jdk 1.8中遇到了这个问题

使用Java 1.7及更低版本时,它可以正常工作。

窗口->首选项-> Java->已安装的JRE

就我而言,我将jre1.8更改为JDK 1.7

然后相应地修改项目facet,选择与所选Installed JRE中相同的Java版本。


@AshishRatan请参阅此答案以获得JDK 8的正确修复
。– vallismortis

0

使用aspectj 1.8.13时遇到类似的错误(org.aspectj.apache.bcel.classfile.ClassFormatException:常量池中的无效字节标记:15)。解决方案是将所有编译对齐到jdk 8,并注意不要将aspectj库的其他版本(例如1.6.13)放到buildpath / classpath中。


0

使用tomcat7:run运行Spring Boot应用程序时,我遇到了同样的问题

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

但是,当我在测试范围内正确指定它时,它不会给出错误:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
    </dependency>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.