java.lang.IllegalArgumentException:无效或不可读的 WAR 文件:打开 zip 文件时出错
Posted
技术标签:
【中文标题】java.lang.IllegalArgumentException:无效或不可读的 WAR 文件:打开 zip 文件时出错【英文标题】:java.lang.IllegalArgumentException: Invalid or unreadable WAR file : error in opening zip file 【发布时间】:2011-07-26 12:30:56 【问题描述】:当我的 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)
提前致谢。
【问题讨论】:
【参考方案1】:原因很清楚:
java.lang.IllegalArgumentException: Invalid or unreadable WAR file : error in opening zip file
WAR
(Web ARchive) 文件是一个 zip 文件,其中包含您的 Web 应用程序的类、库和资源。
将您的 WAR 文件从 a.war
重命名为 a.zip
。如果使用 Winzip/7-Zip/WinRar 无法打开 zip 文件,请重新重建 WAR 文件。
希望这会有所帮助。
【讨论】:
命名为 .war 还是 .zip 应该没有区别。 Vikingsteve,我不明白你的意思。 Java EE 规范规定将 Web 存档文件构建到 WAR 文件(这是一个 zip 文件)中。你想说什么? WAR 文件和 EAR 文件都是具有不同文件结构的 zip 文件。我是说文件的构造可能存在问题,他应该检查实际的 zip 程序。【参考方案2】:不幸的是,原因和解决方案并不那么明显as Buhake Sindi suggests。我之前在几个论坛中多次看到过这个问题。我什至至少亲身经历过一次。 Google 目前对exact 异常消息的点击次数超过 500 次。一切仍未得到答复。然而,有迹象表明它适用于 IDE X,但不适用于 IDE Y,它适用于服务器 X,但不适用于服务器 Y。或者从 WAR 中删除或添加 something 是有效的(一个典型的例子可以找到here)。然而,没有人深入解释真正的根本原因。
我认为这与使用的 JDK/JRE 版本和 WAR 的文件大小的组合有关。以下是您可以尝试的一些方法:
尝试在您的 IDE 和/或应用服务器环境中更新/调整 JDK/JRE 版本。 尝试向 WAR、随机 JAR 或 JSP 文件或其他任何内容添加一些内容,然后重新构建。【讨论】:
添加一个空白 jsp 文件,再次构建和部署 WAR 文件对我有用!但是我仍然不明白为什么会发生这个异常,或者为什么通过在项目中添加一些东西并重新构建它来解决它! 也为我工作,我只在 webapp 内的一个文件夹中添加了一个简短的文本文件,甚至没有被系统引用... 这个问题发生在我通过切换到另一个 git 分支更新源代码后,这与实际代码有很大不同。干净(重新)构建解决了问题。 有这个确切的问题。我的票证分支构建工作,合并开发没有其他更改,并且该构建没有工作。通过对 slf4j.jar 版本的微小更改来更新开发并再次尝试,它在使用竹子重建时遇到了确切的问题。 老板你真棒【参考方案3】:同样的问题。 war文件可以用7-zip打开。
编辑:我知道原因了。 “无效或不可读的 WAR 文件:打开 zip 文件时出错”绝对是一条令人困惑的错误消息。真正的原因只是“Tomcat无法部署战争,因为有一些初始化错误”。就我而言,我的 War 文件缺少一些配置文件,这些文件会抛出未找到文件的异常。不同的 Tomcat 版本似乎会报告不同的错误。在 6.0.26 上,它正确地报告了错误。但是在 6.0.32 上,它报告了令人困惑的“无效或不可读的 WAR 文件”。
【讨论】:
【参考方案4】:如果您在 Linux 上进行部署,请确保用户可以读取运行 tomcat 进程的用户。对war文件运行“chmod +r”,为每个人添加读取权限。
【讨论】:
这解决了我在尝试运行通过 FTP 传输的 WAR 文件时遇到的问题。【参考方案5】:Aby 的具体问题似乎已经解决,但万一其他人偶然发现此页面并遇到与我相同的问题......
确保您的 /opt/solr 目录具有正确的权限集。在后来转到 Tomcat 安装之前,我一直在关注 SolrJetty 教程。因为我的 solr 用户是用这个命令创建的:
useradd -d /opt/solr -s /sbin/false solr
/opt/solr 目录是使用 700 权限创建的,因此 tomcat 无法访问 WAR 文件。改成 755 就完美了。
【讨论】:
【参考方案6】:在我的情况下,文件传输过程中的文件损坏导致了这个问题。因此,当我们将文件传输到远程服务器时,验证文件的校验和始终是最佳实践。
【讨论】:
【参考方案7】:确保 WAR 文件的路径正确。我有一个错字,这得到了同样的错误。
【讨论】:
这更多的是评论而不是答案...有了更多代表,您就可以离开 cmets...【参考方案8】:BalusC 是对的。当我在安装了 Java 的 openjdk 版本而不是常规 JDK 的 Linux 机器上运行我的 webapp 时,我遇到了这个错误。安装普通JDK并将tomcat的JRE_HOME变量指向普通JDK后,问题就消失了。
【讨论】:
【参考方案9】:我随机遇到了错误。我觉得原因很简单。
当您创建 WAR 文件并通过“慢”过程将其传输到 tomcat 目录时,可能会发生这种情况。在我的情况下,它是通过 scp 从远程机器传输的。在传输结束之前,tomcat 可以注意到文件已更改(修改日期等)。然后它可能会尝试部署不完整的文件。会遇到 zip 错误。
理论上,如果您从另一个目录复制文件,也会发生同样的情况;虽然机会更小,因为复制速度更快。
为完全避免该错误,应将文件从同一磁盘上的另一个位置移动(而不是复制)。这样的举动(我认为)是原子性的。
虽然我正在开发,但偶尔出现错误并不是什么大问题;当我遇到它时,我只是重新开始传输。
【讨论】:
这个。在 Windows 中,如果我通过资源管理器将“blah.war”文件从一台机器复制到另一台机器(“慢速”方法),传输大约需要 15 秒,并且会发生错误。如果我将文件重命名为'blah.war.xxx'并复制它,然后重命名它,它会正确启动。【参考方案10】:我遇到了这个问题,我没有在我的构建中添加任何内容或修改任何内容。但我想我的问题是因为我直接将我的战争文件上传到远程tomcat7/webapps/
目录。
将您的战争文件解决到/home/yourusername
之类的中间目录,然后移动到您的webapps
目录。对我来说,这个问题可能是因为文件尚未完全上传,而 tomcat 正在尝试提取/部署它。
希望这会对某人有所帮助。
【讨论】:
对我来说同样的问题,它出现了。我们使用 jenkins 的 post-build ssh 插件直接部署到 /webapps 文件夹。关于如何改进这一点的任何想法?是否可以将 tomcat 配置为在部署战争之前“等待”x 秒? 我使用了一个简单的技巧,将您的文件重命名为yourfile.someotherextension
upload 之类的名称,然后将其重命名为 yourfile.war
应该可以使用
也许 unix touch
命令可以工作?以及如何与詹金斯一起工作?我将不得不运行另一个后期构建步骤,以执行脚本来接触战争文件?无论如何,我也在查看 tomcat 的超时设置 - 你考虑过吗?它叫backgroundProcessorDelay
我不熟悉 jenkins 但你可以使用 unix mv file.war1 file.war
重命名...【参考方案11】:
我多次遇到同样的问题,最后我找到了解决方案.. 确切的解决方案 无论如何,我在本地使用Tomcat 8.0.9进行测试,当将war文件上传到服务器时,我收到解压缩war的错误消息..所以我检查了服务器Tomcat,它是6,所以我安装了那个版本并检查了版本服务器上的 Java 并找到它 5,所以我还确保我在本地计算机上使用版本 5。 问题发生在war文件的打包方式上,因此如果您使用相同的版本和tomcat,它将以服务器可以理解的正确方式打包...... 另一种解决方案..更新服务器版本以匹配您在本地使用的版本。 他们应该是一样的。 希望这能解决您的问题。
【讨论】:
【参考方案12】:我遇到了同样的问题 (java.lang.IllegalArgumentException: Invalid or unreadable WAR file
)。对我来说,原因是我的 WAR 文件中包含了 catalina-6.0.43.jar
。为了消除错误,我创建了一个不包含此 jar 的新 WAR 文件,然后 Tomcat 7 能够成功启动应用程序。不幸的是,这个解决方案只适用于 Tomcat 7。当我尝试在 Tomcat 8 上部署完全相同的 WAR 时,我仍然遇到同样的错误。
【讨论】:
【参考方案13】:在我的例子中,我使用 WinSCP 传输文件。我尝试了很多次这里描述的所有建议。我所做的只是重新启动 WinSCP 并且 tomcat 可以读取该文件。
【讨论】:
【参考方案14】:谢谢@BalusC。有同样的问题。尝试了很多选择。认为这是因为我在没有原型范围的情况下添加到 maven 的 lib,因此它也进入了 war 文件,更正了,结果相同。我可以把它作为一个拉链打开,那里的所有“看起来”都很好。
在本地尝试(不同的 tomcat 版本:7.0.67 与 7.0.22 我有问题)效果很好。然后尝试使用 7.0.22 但在不同的 VM(实例)上 - 效果很好。我怀疑tomcat有问题或者可能与其他文件冲突(这只是与其他VM的区别,包括Java都是一样的)。
使用不同的 tomcat 实例为我解决了这个问题。
【讨论】:
【参考方案15】:在我的情况下,war 文件未从存储库正确下载,因为大小为几 KB。 更正后,我的下载语法正确开始
【讨论】:
以上是关于java.lang.IllegalArgumentException:无效或不可读的 WAR 文件:打开 zip 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章