java.util.zip.ZipException:打开zip文件时出错

我有一个Jar文件,其中包含其他嵌套的jar子。 当我在这个文件上调用新的JarFile()构造函数时,我得到一个exception,它说:

java.util.zip.ZipException:打开zip文件时出错

当我手动解压这个Jar文件的内容并再次压缩时,它工作正常。 另外请注意,这个exception只在WebSphere 6.1.0.7及更高版本上才能看到。 同样的事情在tomcat和WebLogic上也能正常工作。 另外,当我使用JarInputStream而不是JarFile时,我能够读取Jar文件的内容,没有任何例外。 请让我知道,如果你有任何想法如何解决这个问题。

谢谢,桑迪亚

确保你的jar文件没有损坏。 如果它损坏或不能解压缩,则会发生此错误。

我面临同样的问题。 我有一个zip压缩文件java.util.zip.ZipFile无法处理,但WinRar解压缩就好了。 我在SDN上find了有关Java中的压缩和解压缩选项的文章 。 我稍微修改了一个示例代码,以产生最终能够处理归档的方法。 诀窍是使用ZipInputStream而不是ZipFile,并在连续阅读的zip存档。 这种方法也能够处理空的zip文件。 我相信你可以调整方法来满足你的需要,因为所有的zip类都有.jar文件的等价子类。

 public void unzipFileIntoDirectory(File archive, File destinationDir) throws Exception { final int BUFFER_SIZE = 1024; BufferedOutputStream dest = null; FileInputStream fis = new FileInputStream(archive); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); ZipEntry entry; File destFile; while ((entry = zis.getNextEntry()) != null) { destFile = FilesystemUtils.combineFileNames(destinationDir, entry.getName()); if (entry.isDirectory()) { destFile.mkdirs(); continue; } else { int count; byte data[] = new byte[BUFFER_SIZE]; destFile.getParentFile().mkdirs(); FileOutputStream fos = new FileOutputStream(destFile); dest = new BufferedOutputStream(fos, BUFFER_SIZE); while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); fos.close(); } } zis.close(); fis.close(); } 

这可能与log4j有关。

你在websphere的java类path(如启动文件中定义的)以及应用程序类path中有log4j.jar文件吗?

如果确实要确保log4j.jar文件在java classpath中,并且它不在webapp的web-inf / lib目录中。


它也可以与ant版本 (可能不是你的情况,但我把它放在这里作为参考):

您的类path中有一个.class文件(即不是目录或.jar文件)。 从ant 1.6开始,ant将打开清单条目的类path中的文件。 此尝试打开将失败,错误“java.util.zip.ZipException”

这个问题在ant 1.5中不存在,因为它不会尝试打开文件。 – 所以确保你的类path不包含.class文件。


在附注中,您是否考虑过单独的jar子 ?
你可以在你的主jar的清单中,参考其他具有这个属性的jar:

 Class-Path: one.jar two.jar three.jar 

然后,将所有的jar子放在同一个文件夹中。
再次,可能不适合你的情况,但仍然有参考。

在JVM认为是临时目录的情况下,由于不在那里或者没有写权限,我以前看过这个exception。

我通过清除jboss-xyz / server [config] / tmp和jboss-xyz / server / [config] / work目录来解决这个问题。

当我写入文件系统的磁盘空间不足时,我也会看到这个错误。 所以你可以给它更多的空间,清理日志文件等

我看到这个具有Java 6的特定Zip文件,但是当我升级到Java 8(没有testingJava 7)时,它消失了,所以看起来新版本的ZipFile在Java中支持更多的压缩algorithm,因此可以读取文件与早期版本失败。

由于损坏的ZIP Fils,我面临这个问题

检查您的JAR文件是否完全下载

Liquibase对我来说是这个错误。 我解决了这个问题后,我debugging,看着liquibase尝试加载库,发现它是commons-codec-1.6.jar清单文件错误。 从本质上讲,你的path中有一个损坏的zip文件,或者有一个不兼容的版本被使用。 当我在这个库的Maven仓库上进行了一些探索之后,发现有更新的版本,并将新版本添加到了pom.xml中。 我能够在这一点上进行。

也许zip文件被损坏,或下载时被破坏。

我得到例外

 java.util.zip.ZipException: invalid entry CRC (expected 0x0 but got 0xdeadface) at java.util.zip.ZipInputStream.read(ZipInputStream.java:221) at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:140) at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:118) ... 

在Java中解压档案时。 由于7zip(和其他)没有任何关于无效CRC的问题或抱怨,档案本身似乎没有被破坏。

我转而使用Apache Commons Compress来阅读zip-entries并解决了这个问题。