我将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)
可能是什么问题?
答案 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字节码都是):
答案 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>