java.lang.IllegalArgumentException: 无效或无法读取的WAR文件:打开zip文件时出错。

15


当我的 display.war 文件在 Tomcat 上执行时,我在 Catalina.2011-03-30.log 中遇到了这个错误。下面是错误信息:

Mar 30, 2011 8:01:31 PM org.apache.catalina.startup.ContextConfig init  
SEVERE: Exception fixing docBase for context [/Display]   
java.util.zip.ZipException: error in opening zip file  

    at java.util.zip.ZipFile.open(Native Method)  
    at java.util.zip.ZipFile.<init>(ZipFile.java:114)
    at java.util.jar.JarFile.<init>(JarFile.java:135)
    at java.util.jar.JarFile.<init>(JarFile.java:72)
    at sun.net.www.protocol.jar.URLJarFile.<init>(URLJarFile.java:72)
    at sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:48)
    at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:70)
    at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:104)
    at sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:71)
    at org.apache.catalina.startup.ExpandWar.expand(ExpandWar.java:148)
    at org.apache.catalina.startup.ContextConfig.fixDocBase(ContextConfig.java:886)
    at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:1021)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:279)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.StandardContext.init(StandardContext.java:5602)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4378)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:905)
    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:740)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:500)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1345)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:303)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
    at java.lang.Thread.run(Thread.java:662)  

Mar 30, 2011 8:01:31 PM org.apache.catalina.core.StandardContext resourcesStart
SEVERE: Error starting static Resources  

java.lang.IllegalArgumentException: Invalid or unreadable WAR file : error in opening zip file  
    at org.apache.naming.resources.WARDirContext.setDocBase(WARDirContext.java:135)  
    at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4249)  
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4418)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:905)
    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:740)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:500)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1345)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:303)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
    at java.lang.Thread.run(Thread.java:662)  

提前感谢。

15个回答

17

不幸的是,这个问题的原因和解决方法并不像Buhake Sindi所建议的那样那么明显。我在几个论坛上多次看到过这个问题。我自己至少也经历过一次。谷歌目前显示有超过 500 条与具体的异常信息相关的搜索结果,但这些问题仍未得到解答。然而,有一些提示表明它在 IDE X 上可以工作,但在 IDE Y 上不能工作,在 Server X 上可以工作,但在 Server Y 上不能工作。或者从 WAR 中添加或删除某些内容可以解决该问题(一个典型的例子可以在这里找到)。然而,没有人深入解释了真正的根本原因。

我认为这可能与使用的JDK/JRE版本以及WAR文件大小的组合有关。以下是一些尝试的方法:

  • 尝试在IDE和/或应用服务器环境中更新/对齐JDK/JRE版本。
  • 尝试向WAR中添加一些东西,例如随机的JAR或JSP文件,然后重建。

2
添加一个空的 jsp 文件,再次构建和部署 WAR 文件对我很有帮助!但我仍然不明白为什么会发生这个异常,或者为什么通过添加一些东西到项目中,并重新构建它来解决问题! - Bernice
对我也起作用了,我只是在 webapp 内的一个文件夹中添加了一个短文本文件,甚至系统都没有引用它... - sam
在我更新源代码并切换到另一个与实际代码显著不同的git分支后,我遇到了这个问题。重新进行一次干净的构建解决了这个问题。 - kazy
我曾经遇到过这个问题。我的代码分支编译成功了,但是合并到 develop 分支后却无法编译成功。尝试将 slf4j.jar 版本进行微小修改后重新编译,就可以顺利通过了。但是使用 bamboo 重新构建时却出现了完全相同的问题。 - Fresh Codemonger
你是一个了不起的老板。 - Veerendar Chary Munigadapa

10

我偶然遇到了这个错误。我认为原因很简单。

当你通过“缓慢”的方式创建WAR文件并将其传输到tomcat目录中时,就会出现这种情况。在我的情况下,是通过scp从远程机器传输。 tomcat可以在传输完成之前注意到文件已更改(修改日期等)。然后它可能尝试部署不完整的文件。这将导致zip错误。

理论上,如果您从另一个目录复制文件,则可能发生相同的情况;但是机会较小,因为复制速度更快。

为了完全避免错误,应该将文件从同一磁盘上的其他位置移动(而不是复制)。这样的移动是(我认为)原子的。

虽然我正在开发过程中,偶尔出现错误并不是什么大问题;当我遇到它时,我只需重新启动传输即可。


1
在Windows中,如果我通过资源管理器将一个'blah.war'文件从一台机器复制到另一台机器(这是一种“慢”的方法),则需要大约15秒钟才能传输,并且会出现错误。 如果我将文件重命名为'blah.war.xxx'并进行复制,然后再将其重命名,则可以正确启动。 - joe7pak

4

如果您正在Linux上部署,请确保该文件可以被tomcat进程所运行的用户读取。运行"chmod +r"命令将read权限添加到war文件,以便所有人都能读取该文件。


这解决了我在尝试运行通过FTP传输的WAR文件时遇到的问题。 - Boston Walker

3
我遇到了这个问题,我没有添加任何内容或修改任何构建内容。但我猜测我的问题是因为我直接将war文件上传到远程tomcat7/webapps/目录引起的。
解决方案是将您的war文件移动到中间目录(例如/home/yourusername),然后再移动到webapps目录。对于我来说,可能是因为文件还没有完全上传,而tomcat正在尝试提取/部署它。
希望这可以帮助某些人。

我也遇到了同样的问题。我们正在使用Jenkins的post-build ssh插件直接部署到/webapps文件夹。有什么改进的想法吗?是否可以配置Tomcat在部署war文件之前“等待”x秒钟? - vikingsteve
我使用一个简单的技巧,将你的文件重新命名为类似于 yourfile.someotherextension 的名称,然后上传并将它重新命名回 yourfile.war,这应该可以解决问题。 - KKK
也许Unix的“touch”命令可以起作用?如何使其与Jenkins配合使用?我需要运行另一个后构建步骤,以执行脚本来触碰WAR文件?无论如何,我还在查看Tomcat的超时设置 - 你考虑过这个吗?它被称为“backgroundProcessorDelay”。 - vikingsteve
我不熟悉Jenkins,但你可以使用Unix的mv file.war1 file.war来重命名... - KKK

3

我也遇到了同样的问题。war文件可以通过7-zip打开。

编辑:我找到了原因。"Invalid or unreadable WAR file : error in opening zip file"这个错误信息确实令人困惑。实际原因是"Tomcat无法部署WAR文件,因为存在一些初始化错误"。在我的情况下,我的War文件缺少一些配置文件,导致文件未找到异常。不同版本的Tomcat似乎会报告不同的错误。在6.0.26上,它正确地报告了错误。但是在6.0.32上,它报告了令人困惑的"Invalid or unreadable WAR file"。


1
我曾多次遇到同样的问题,最终找到了解决方法...确切的解决方法。无论如何,我在本地测试时使用的是Tomcat 8.0.9,当我上传war文件到服务器时,出现了解压war文件时的错误信息。所以我检查了服务器上的Tomcat版本,发现是6,然后检查了服务器上的Java版本,发现是5,因此我也确保在我的本地机器上使用版本5。问题出在war文件打包方式上,如果你使用相同版本和Tomcat,则可以正确打包,使服务器能够理解。另一种解决方法是将服务器版本更新为与本地使用的版本相匹配。它们应该是相同的。希望这能解决您的问题。

0

在我的情况下,从仓库下载的war文件由于大小只有几KB而未能正确下载。 纠正了我的下载语法后,它开始正常运行。


0
Aby的特定问题似乎已经解决了,但如果有其他人在这个页面上遇到了和我一样的问题...
请确保您的/opt/solr目录设置了正确的权限。我之前是按照SolrJetty教程操作的,后来才转移到Tomcat安装。因为我的solr用户是使用这个命令创建的:
useradd -d /opt/solr -s /sbin/false solr

/opt/solr目录的权限设置为700,因此Tomcat无法访问WAR文件。将其更改为755后,问题得到完美解决。


0

我遇到了相同的问题(java.lang.IllegalArgumentException: Invalid or unreadable WAR file)。原因是我在WAR文件中包含了 catalina-6.0.43.jar。为了解决错误,我创建了一个新的WAR文件,没有包含这个jar文件,然后Tomcat 7能够成功启动应用程序。不幸的是,这个解决方案只适用于Tomcat 7。当我尝试在Tomcat 8上部署完全相同的WAR文件时,仍然会遇到相同的错误。


0
在我的情况下,我使用WinSCP传输文件。我尝试了这里描述的所有建议很多次。让它工作的全部方法就是重新启动WinSCP,然后Tomcat就可以读取文件了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接