首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量池中的org.apache.tomcat.util.bcel.classfile.ClassFormatException:无效字节标记: 15

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

Stack Overflow用户
提问于 2014-05-08 12:17:02
回答 10查看 210K关注 0票数 91

我正在将一个webapp从Tomcat 7移植到使用Tomcat 7但使用Java 8的另一个服务器。

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

代码语言:javascript
复制
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)

有什么问题吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2014-05-12 12:18:23

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

但是,如果启用了注释扫描(元数据完整=web.xml中的“true”),则会出现一些问题,原因是BCEL (无法处理新的Java8字节代码)。您将得到类似的异常(至少使用Tomcat 7.0.28):

代码语言:javascript
复制
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版(更新后的编译器具有更好的Java8支持)。

(更新2014-10-17)如果您的是使用注释扫描和的,那么您自己的代码不是基于Java 8的,另一个解决方案是在/etc/tomcat7/catalina.properties中添加以下行(在"ant-launcher.jar“之后添加的文本是属性tomcat.util.scan.DefaultJarScanner.jarsToSkip的一部分):

代码语言:javascript
复制
junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar

在Debian7.6上使用Tomcat 7.0.28和Oracle 8_25进行测试。

票数 90
EN

Stack Overflow用户

发布于 2017-05-22 16:54:13

这是一个猫虫,它再次出现在Java9字节码上。修复此问题的确切版本(都适用于Java 8/9字节码)是:

  • 后备箱9.0.0.M18
  • 8.5.12以后的8.5.x
  • 8.0.x为8.0.42以后
  • 7.0.x为7.0.76以后
票数 38
EN

Stack Overflow用户

发布于 2015-02-15 20:20:31

更新到Tomcat 7.0.58 (或更新)。

请参阅:bug.cgi?id=57173#c16

触发此回归的性能改进已从主干、8.0.x ( 8.0.16以后)和7.0.x ( 7.0.58以后)恢复,将不再应用。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23541532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档