Tomcat 8.5.74搭配JRE17启动报ClassFormatException及UI异常求助
Tomcat 8.5.74 + JRE 17.0.9 环境异常排查与解决
问题描述
使用Tomcat 8.5.74搭配JRE 17.0.9搭建运行环境,服务器启动后日志抛出org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException异常,同时UI界面存在部分按钮无法正常工作的情况。
异常日志
org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException INFO | jvm 1 | 2024/03/07 10:09:35 | at org.lassFilejdt.internal.compiler.classfmt.ClassFileReader.<init>(ClassFileReader.java:406) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:231) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:207) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:174) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.lookup.PackageBinding.getTypeOrPackage(PackageBinding.java:201) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.lookup.BlockScope.getBinding(BlockScope.java:500) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference.resolveType(QualifiedNameReference.java:999) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:636) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:684) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Expression.resolve(Expression.java:1026) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:117) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.DoStatement.resolve(DoStatement.java:226) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:117) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(IfStatement.java:276) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Block.resolveUsing(Block.java:130) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.TryStatement.resolve(TryStatement.java:1073) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:117) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.DoStatement.resolve(DoStatement.java:226) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:117) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(IfStatement.java:276) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Block.resolveUsing(Block.java:130) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.TryStatement.resolve(TryStatement.java:1073) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.Block.resolveUsing(Block.java:130) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.TryStatement.resolve(TryStatement.java:1073) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:634) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:306) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:544) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1195) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1308) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:593) INFO | jvm 1 | 2024/03/07 10:09:35 | at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:867)
问题原因
Tomcat 8.5.x官方兼容的JDK版本范围是JDK 8 至 JDK 11,JRE 17属于高版本,超出其兼容范围。Tomcat内置的JDT编译器无法正确解析高版本JRE环境下的类文件格式,从而抛出ClassFormatException;部分UI按钮失效则是因为相关Servlet或JSP文件编译失败,导致对应的功能无法正常加载。
解决方案
- 版本匹配调整:
- 降级JRE至Tomcat 8.5.x支持的版本(如JRE 8或JRE 11),确保运行环境版本兼容。
- 若必须使用JRE 17,升级Tomcat至9.0.x及以上版本(Tomcat 9支持JDK 8至JDK 17),同步更新编译器与运行环境的兼容性。
- 清理编译缓存:删除Tomcat安装目录下的
work文件夹,清除旧的编译生成文件,避免残留的不兼容文件干扰运行。 - 项目编译检查:确认项目中的类文件是否由高于JRE 11的JDK编译,若存在此类文件,重新用兼容版本的JDK编译项目后再部署。
内容的提问来源于stack exchange,提问作者jagadeesh kumar
相关产品推荐
相关产品推荐

