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.更新并在<root or instance tomcat folder>/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的主要内容,如果未能解决你的问题,请参考以下文章