Tomcat运行Web服务抛出ClassFormatException异常求助(Java9.0+Tomcat7.0.47)
解决Tomcat 7.0.47 + Java 9环境下的ClassFormatException问题
我之前帮同事排查过一模一样的问题,折腾了好一阵才找到根源——Tomcat 7.0.47自带的BCEL类库根本不支持Java 9及以上版本的字节码格式。你看到的Invalid byte tag in constant pool: 19,就是因为Java 9引入了旧BCEL无法识别的常量池类型,导致类加载时解析字节码失败。
给你几个可行的解决方案,按优先级排序:
- 优先升级Tomcat版本:Tomcat 8.5及以后的分支才正式兼容Java 9+,建议直接升级到Tomcat 8.5.x或者9.x版本,这些版本的BCEL库已经更新,能完美处理新的字节码结构。而且Tomcat7早就停止官方维护了,升级也能获得后续的安全补丁。
- 临时降级Java版本:如果暂时没法升级Tomcat,那就把Java环境换回Java 8,Tomcat7对Java8的支持是完全没问题的,这样能快速绕过这个异常。
- 调整编译配置:如果必须留在Java9环境,那要确保你的Web应用代码是按Java8的字节码标准编译的。比如用Maven的话,在
pom.xml里配置maven-compiler-plugin:
Gradle的话就在<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>build.gradle里添加:
这样编译出来的字节码是Tomcat7能识别的格式,也能解决问题。sourceCompatibility = '1.8' targetCompatibility = '1.8'
内容的提问来源于stack exchange,提问作者user3503297
相关产品推荐
相关产品推荐

