Spring Boot内嵌Tomcat启动失败:zip file closed异常
Spring Boot 3.0.2(内嵌Tomcat 10.1.5)启动报错:zip file closed
使用Spring Boot 3.0.2(内嵌Tomcat 10.1.5)启动服务时触发以下错误,完整堆栈信息如下:
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[/IAMWeb]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) Caused by: java.lang.IllegalStateException: zip file closed at java.base/java.util.zip.ZipFile.ensureOpen(ZipFile.java:831) at java.base/java.util.zip.ZipFile.getManifestName(ZipFile.java:1057) at java.base/java.util.zip.ZipFile$1.getManifestName(ZipFile.java:1100) at java.base/java.util.jar.JarFile.getManEntry(JarFile.java:937) at java.base/java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:1000) at java.base/java.util.jar.JarFile.isMultiRelease(JarFile.java:389) at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:68) at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:41) at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:393) at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:328) at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:271) at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:234) at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5144) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 43 common frames omitted
解决办法
- 检查依赖完整性:删除本地仓库中可能损坏或重复的Jar包,重新拉取所有依赖。这类报错大概率是Tomcat扫描类路径时,某个Jar文件被提前关闭或损坏导致。
- 跳过不必要的Jar扫描:在Spring Boot配置文件中添加Tomcat扫描过滤规则,减少扫描范围:
或者通过Java代码配置:# 跳过所有Jar的TLD扫描,可按需调整为特定Jar server.tomcat.additional-tld-skip-patterns=*.jar@Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory() { return new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { StandardJarScanner jarScanner = (StandardJarScanner) context.getJarScanner(); // 关闭Manifest扫描,避免触发Jar文件检查 jarScanner.setScanManifest(false); } }; } - 验证文件权限:确保应用对类路径下的Jar文件有读取权限,权限不足可能导致Jar被异常关闭。
- 升级Tomcat版本:将内嵌Tomcat升级到10.1.6及以上版本,官方可能已修复该Jar扫描相关Bug。
内容的提问来源于stack exchange,提问作者Vikram R
相关产品推荐
相关产品推荐

