我正在将一个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)有什么问题吗?
发布于 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):
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的一部分):
junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar在Debian7.6上使用Tomcat 7.0.28和Oracle 8_25进行测试。
发布于 2017-05-22 16:54:13
这是一个猫虫,它再次出现在Java9字节码上。修复此问题的确切版本(都适用于Java 8/9字节码)是:
发布于 2015-02-15 20:20:31
更新到Tomcat 7.0.58 (或更新)。
触发此回归的性能改进已从主干、8.0.x ( 8.0.16以后)和7.0.x ( 7.0.58以后)恢复,将不再应用。
https://stackoverflow.com/questions/23541532
复制相似问题