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

Posted

技术标签:

【中文标题】org.apache.tomcat.util.bcel.classfile.ClassFormatException:常量池中的无效字节标记:15【英文标题】:org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15 【发布时间】:2014-06-25 19:57:01 【问题描述】:

我正在将一个 webapp 从 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 支持。 ***.com/questions/23801950/… @AnantLaxmikantBobde 这与此问题的原因无关,这是该特定版本的 Tomcat 与该版本的 JDK 之间的字节码不兼容。请参阅this answer 以获得正确的修复。 【参考方案1】:

“官方答案”是 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 中添加以下行(文本添加在“ant-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 标志,***.com/questions/25279729/… 上的相关问题 澄清一下:如果metadata-complete="true" 在web.xml 中注释处理应该被禁用,对吧? 可能评论已经过时了,但是将 tomcat 从 7.0.23 更改为 8.0.18 会自动为我解决问题 [Windows 7] 在 catalina.properties 中修改 tomcat.util.scan.DefaultJarScanner.jarsToSkip 对我来说适用于 Tomcat 8。 (至少它揭示了其他问题!) @SamuelThompson 请参阅this answer 了解 Tomcat 8 的正确修复。【参考方案2】:

这是一个Tomcat bug,在 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 起

【讨论】:

这为我解决了问题(JDK 8 with Tomcat 8.0.27 failed) tomcat 8.0.36 和 log4j-api-2.11.0.jar 遇到这个问题 这解决了问题。更新你的 Tomcat 版本【参考方案3】:

更新到 Tomcat 7.0.58(或更高版本)。

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

触发此回归的性能改进是 从主干、8.0.x(适用于 8.0.16 及更高版本)和 7.0.x(适用于 7.0.58 起)并且不会被重新应用。

【讨论】:

我在此链接中没有找到与 java 8 的任何关系。【参考方案4】:

出现此问题是因为您安装了 jre1.8.0_101-1.8.0_101-fcs.i58.rpm 以及 jdk-1.7.0_80-fcs.x86_64.rpm。所以只需卸载您的 jre rpm 并重新启动您的应用程序。应该会成功的。

【讨论】:

【参考方案5】:
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.更新并在&lt;root or instance tomcat folder&gt;/conf/catalina.properties中追加以下参数

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

2.清理并部署要发布的项目。

【讨论】:

我不得不恢复到 1.14.8 版本(AFAIK 具有相同的主要功能,所以这里没什么大不了的)【参考方案6】:

对我来说,将 bcel 升级到 6.0 解决了这个问题。

【讨论】:

【参考方案7】:

对我来说,通过从战争中移除有问题的罐子,它很有效。 使用 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>

【讨论】:

【参考方案8】:

我在使用 tomcat 7 + jdk 1.8 时遇到了这个问题

使用 java 1.7 及更低版本可以正常工作。

窗口 -> 首选项 -> java -> 安装的 jre

在我的情况下,我改变了 jre1.8 到 JDK 1.7

并相应地修改项目方面,选择与选定的已安装 JRE 中相同的 java 版本。

【讨论】:

@AshishRatan 请参阅 this answer 了解 JDK 8 的正确修复。【参考方案9】:

我在使用 aspectj 1.8.13 时遇到了类似的错误(org.aspectj.apache.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15)。解决方案是将所有编译对齐到 jdk 8 中,并注意不要将 aspectj 库(例如 1.6.13)的其他版本放到 buildpath/classpath 中。

【讨论】:

【参考方案10】:

我在使用 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>

【讨论】:

以上是关于org.apache.tomcat.util.bcel.classfile.ClassFormatException:常量池中的无效字节标记:15的主要内容,如果未能解决你的问题,请参考以下文章