SpringBoot应用请求处理报错:无法打开Zip文件,求助定位问题
解决SpringBoot应用中Tomcat处理请求时的ZipException错误
我有一个SpringBoot应用,在查看日志时发现如下请求处理错误,无法确定问题来源:
2018-01-30 11:08 [http-nio-1234-exec-1] ERROR o.a.coyote.http11.Http11Processor - 处理请求出错 java.lang.IllegalStateException: java.util.zip.ZipException: 打开zip文件出错 at org.apache.catalina.webresources.JarWarResourceSet.getArchiveEntries(JarWarResourceSet.java:133) at org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:256) at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:281) at org.apache.catalina.webresources.CachedResource.validateResource(CachedResource.java:97) at org.apache.catalina.webresources.Cache.getResource(Cache.java:69) at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:216) at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:206) at org.apache.catalina.mapper.Mapper.internalMapWrapper(Mapper.java:1027) at org.apache.catalina.mapper.Mapper.internalMap(Mapper.java:842) at org.apache.catalina.mapper.Mapper.map(Mapper.java:698) at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:679) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
从你贴的错误日志来看,核心问题是java.util.zip.ZipException: 打开zip文件出错,这是SpringBoot内嵌的Tomcat在尝试读取Web资源中的Jar/War文件时遇到了损坏、权限不足或者缓存异常的情况。下面是我整理的排查步骤和解决办法,按优先级尝试:
1. 排查依赖Jar包是否损坏
这是最常见的诱因,Maven/Gradle在下载依赖时可能因为网络波动导致Jar包不完整。
- 解决步骤:
- 清空本地Maven仓库(默认路径
~/.m2/repository)或Gradle缓存(默认~/.gradle/caches)中你项目对应的依赖目录 - 重新执行
mvn clean install(Maven)或者gradle clean build(Gradle),让构建工具重新下载完整的依赖 - 可以用
jar -tf your-dependency.jar命令检查Jar包完整性,如果执行时报错,说明这个Jar确实损坏了
- 清空本地Maven仓库(默认路径
2. 清理Tomcat临时缓存文件
内嵌Tomcat会在系统临时目录生成缓存的Web资源文件,这些文件一旦损坏就会触发读取错误。
- 解决步骤:
- 先停止你的SpringBoot应用
- 找到系统临时目录里的
tomcat.*文件夹(Linux一般在/tmp下,Windows在C:\Users\你的用户名\AppData\Local\Temp下),直接删除 - 重新启动应用,Tomcat会自动重建这些缓存文件
3. 检查文件权限
如果应用运行的用户没有权限读取依赖Jar包或者Tomcat临时目录,也会导致无法打开Zip文件。
- 解决步骤:
- 检查项目依赖目录下的Jar包权限,确保运行应用的用户拥有读权限
- 检查Tomcat临时目录的权限,确保运行用户有读写权限
4. 重新打包应用(针对FatJar)
如果你的项目用了SpringBoot默认的FatJar打包方式,打包过程中可能出现Jar合并错误导致最终的应用Jar损坏。
- 解决步骤:
- 执行
mvn clean package -DskipTests跳过测试重新打包,避免测试阶段的干扰 - 用
java -jar your-app.jar直接启动打包后的Jar,验证是否能正常运行,排除打包问题
- 执行
验证解决效果
完成上述步骤后,启动应用并发送请求,查看日志是否还有该错误。如果问题依旧,可以尝试替换Tomcat版本(在SpringBoot的pom.xml或build.gradle中指定不同的Tomcat版本),排查是否是Tomcat版本的兼容性问题。
内容的提问来源于stack exchange,提问作者Ramon De Les Olives
相关产品推荐
相关产品推荐

