【问题标题】:org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15org.apache.tomcat.util.bcel.classfile.ClassFormatException:常量池中的无效字节标记: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 支持。 stackoverflow.com/questions/23801950/…
  • @AnantLaxmikantBobde 这与此问题的原因无关,这是该特定版本的 Tomcat 与该版本的 JDK 之间的字节码不兼容。请参阅this answer 以获得正确的修复。

标签: java eclipse tomcat java-8 classformatexception


【解决方案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 标志,stackoverflow.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>
          

          【讨论】:

            猜你喜欢
            • 2015-09-21
            • 2014-12-25
            • 2014-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-25
            相关资源
            最近更新 更多