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

时间:2014-05-08 12:17:03

标签: java eclipse tomcat java-8 classformatexception

我将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)

可能是什么问题?

10 个答案:

答案 0 :(得分:67)

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

但是,如果启用了注释扫描(metadata-complete =&#34; true&#34;在web.xml中),则由于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中添加以下行(&#后添加的文字) 34; ant-launcher.jar&#34;属性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进行测试。

答案 1 :(得分:11)

这是一个Tomcat bug,再次使用Java 9字节码重新浮出水面。解决这个问题的确切版本(对于Java 8/9字节码都是):

  • 主干为9.0.0.M18以后
  • 8.5.x for 8.5.12以后
  • 8.0.x for 8.0.42以后
  • 7.0.x for 7.0.76以后

答案 2 :(得分:9)

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

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

答案 3 :(得分:2)

这个问题正在发生,因为你已经安装了jre1.8.0_101-1.8.0_101-fcs.i58.rpm以及jdk-1.7.0_80-fcs.x86_64.rpm。所以只需卸载你的jre rpm&amp;重启你的申请。它应该可以解决。

答案 4 :(得分:1)

对我来说,将bcel升级到6.0修复了问题。

答案 5 :(得分: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,并在<root or instance tomcat folder>/conf/catalina.properties

中附加以下参数
org.apache.catalina.startup.ContextConfig.jarsToSkip=...,lombok-1.18.4.jar

2。清理并部署将要执行的项目。

答案 6 :(得分:0)

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

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

窗口 - &gt;偏好 - &gt; java - &gt;安装jre

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

对我来说,通过从战争中移出相关的罐子,它发挥了作用。 使用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>

答案 9 :(得分: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>