Spring Boot 3.2.0-RC1启动报java.util.zip.ZipException异常求助
Spring Boot 3.2.0-RC1启动ZipException异常解决方案
问题背景
基于Spring Boot 3.2.0-M3开发的Java 17应用,升级到3.2.0-RC1后构建成功,但启动时抛出如下Zip异常:
java.util.zip.ZipException: invalid entry size (expected 1140260872 but got 0 bytes) at java.util.zip.ZipInputStream.readEnd(ZipInputStream.java:399) ~[?:?] at java.util.zip.ZipInputStream.read(ZipInputStream.java:198) ~[?:?] at java.util.jar.JarInputStream.read(JarInputStream.java:194) ~[?:?] at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:142) ~[?:?] at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:120) ~[?:?] at java.util.jar.JarInputStream.<init>(JarInputStream.java:84) ~[?:?] at java.util.jar.JarInputStream.<init>(JarInputStream.java:61) ~[?:?] at org.apache.tomcat.util.scan.NonClosingJarInputStream.<init>(NonClosingJarInputStream.java:37) ~[tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.UrlJar.createJarInputStream(UrlJar.java:47) ~[tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.AbstractInputStreamJar.reset(AbstractInputStreamJar.java:160) ~[tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.AbstractInputStreamJar.getManifest(AbstractInputStreamJar.java:151) ~[tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.StandardJarScanner.processManifest(StandardJarScanner.java:444) ~[tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:399) ~[tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:332) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:275) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:238) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) [tomcat-embed-jasper-10.1.10.jar!/:?] at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) [tomcat-embed-jasper-10.1.10.jar!/:?] at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) [tomcat-embed-jasper-10.1.10.jar!/:?] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4850) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) [tomcat-embed-core-10.1.15.jar!/:?] at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-embed-core-10.1.15.jar!/:?] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) [?:?] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:845) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) [tomcat-embed-core-10.1.15.jar!/:?] at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-embed-core-10.1.15.jar!/:?] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) [?:?] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:240) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [tomcat-embed-core-10.1.15.jar!/:?] at org.apache.catalina.startup.Tomcat.start(Tomcat.java:488) [tomcat-embed-core-10.1.15.jar!/:?] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:501) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at com.test.MyAppRestBootApp$1.getTomcatWebServer(MyAppRestBootApp.java:110) [!/:?] at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:218) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:188) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:610) [spring-context-6.1.0-RC1.jar!/:6.1.0-RC1] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:748) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:450) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) [spring-boot-3.2.0-RC1.jar!/:3.2.0-RC1] at com.test.MyAppRestBootApp.main(MyAppRestBootApp.java:97) [!/:?]
解决方案
1. 清理本地仓库并重新构建
- 原因:升级过程中可能下载了损坏的依赖Jar包,或本地缓存的Jar文件已损坏。
- 操作:
- Maven:删除
~/.m2/repository目录,执行mvn clean install重新下载依赖并构建。 - Gradle:删除
~/.gradle/caches目录,执行./gradlew clean build重新构建。
- Maven:删除
2. 验证并替换损坏的Jar包
- 原因:异常由Tomcat扫描Jar时触发,可定位并检查可疑Jar的完整性。
- 操作:
- 从异常栈中找到涉及的Jar(如
tomcat-embed-core-10.1.15.jar),在本地仓库中找到对应文件。 - 用命令验证Jar完整性:
unzip -t tomcat-embed-core-10.1.15.jar,若提示损坏则删除该文件,重新执行构建命令下载。
- 从异常栈中找到涉及的Jar(如
3. 调整Tomcat的Jar扫描策略
- 原因:Spring Boot 3.2.0-RC1升级了Tomcat版本,默认扫描逻辑可能触发对损坏或特殊Jar的处理。
- 操作:
- 配置文件方式:在
application.properties中添加跳过扫描规则:# 跳过所有Jar的TLD扫描,按需调整为特定Jar server.tomcat.additional-tld-skip-patterns=*.jar - Java配置方式:自定义Tomcat工厂修改扫描逻辑:
@Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory() { return new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { StandardJarScanner jarScanner = (StandardJarScanner) context.getJarScanner(); // 关闭Manifest扫描 jarScanner.setScanManifest(false); // 或设置仅扫描指定目录/Jar,排除可疑依赖 // jarScanner.setScanAllDirectories(false); // jarScanner.setJarScanFilter(...); } }; }
- 配置文件方式:在
4. 检查自定义Tomcat配置
- 原因:项目中存在自定义Tomcat配置(如
MyAppRestBootApp$1.getTomcatWebServer),升级后可能与新版本Tomcat不兼容。 - 操作:查看自定义Tomcat配置代码,确认是否修改了Jar扫描、输入流处理等逻辑,调整为适配Tomcat 10.1.15的实现。
5. 临时回退版本
- 若上述方案均无效,可暂时回退到Spring Boot 3.2.0-M3,等待RC版本的后续修复或正式版发布。
内容的提问来源于stack exchange,提问作者ashishl
相关产品推荐
相关产品推荐

