You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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重新构建。

2. 验证并替换损坏的Jar包

  • 原因:异常由Tomcat扫描Jar时触发,可定位并检查可疑Jar的完整性。
  • 操作:
    • 从异常栈中找到涉及的Jar(如tomcat-embed-core-10.1.15.jar),在本地仓库中找到对应文件。
    • 用命令验证Jar完整性:unzip -t tomcat-embed-core-10.1.15.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:47:02