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

时间:2008-11-28 07:12:02

标签: java zip unzip

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

  

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

当我手动解压缩此Jar文件的内容并再次压缩它时,它可以正常工作。

我只在WebSphere 6.1.0.7及更高版本上看到此异常。同样的事情在tomcat和WebLogic上运行良好。

当我使用JarInputStream而不是JarFile时,我能够毫无例外地读取Jar文件的内容。

15 个答案:

答案 0 :(得分:26)

确保您的jar文件没有损坏。如果它已损坏或无法解压缩,则会发生此错误。

答案 1 :(得分:16)

我遇到了同样的问题。我有一个zip存档,java.util.zip.ZipFile无法处理,但WinRar解压缩就好了。我发现article on SDN关于Java中的压缩和解压缩选项。我稍微修改了一个示例代码,以生成最终能够处理存档的方法。 Trick正在使用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();
}

答案 2 :(得分:10)

它可能与log4j有关。

您是否在websphere java类路径(如启动文件中定义)以及应用程序类路径中有log4j.jar文件?

如果您确实确保log4j.jar文件位于java类路径中,并且它不在您的webapp的web-inf / lib目录中。


它也可能与ant version有关(可能不是你的情况,但我确实把它放在这里供参考):

  

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

     

ant 1.5不存在这个问题,因为它不会尝试打开文件。 - 所以请确保您的类路径不包含.class文件。


另外,您是否考虑过separate jars? 您可以在主jar的清单中,使用此属性引用其他jar:

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

然后,将所有罐子放在同一个文件夹中 同样,可能对您的案件无效,但仍可供参考。

答案 3 :(得分:8)

在JVM认为 temp 目录由于不存在或没有写入权限而无法访问之前,我已经看到过此异常。

答案 4 :(得分:3)

我通过清除jboss-x.y.z / server [config] / tmp和jboss-x.y.z / server / [config] / work目录解决了这个问题。

答案 5 :(得分:3)

由于 ZIP Fils

损坏,我遇到了这个问题

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

答案 8 :(得分:0)

Liquibase给我带来了这个错误。在我调试并观察liquibase尝试加载库并发现它在commons-codec-1.6.jar的清单文件上出错之后我解决了这个问题。从本质上讲,路径中某处存在损坏的zip文件,或者使用了不兼容的版本。当我在这个库的Maven存储库上进行探索时,我发现有更新版本并将更新版本添加到pom.xml中。我能够在这一点上继续前进。

答案 9 :(得分:0)

下载时,zip文件可能已损坏或已损坏。

答案 10 :(得分:0)

我得到了异常

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条目并解决了问题。

答案 11 :(得分:0)

为了克服ZipException,我使用commons-compress编写的名为1.14 jarchivelib thrau 的包装器使得从File对象中提取或压缩变得容易。

示例:

public static void main(String[] args) {
        String zipfilePath = 
                "E:/Selenium_Server/geckodriver-v0.19.0-linux64.tar.gz";
                //"E:/Selenium_Server/geckodriver-v0.19.0-win32.zip";
        String outdir = "E:/Selenium_Server/";
        exratctFileList(zipfilePath, outdir );
}
public void exratctFileList( String zipfilePath, String outdir ) throws IOException {
    File archive = new File( zipfilePath );
    File destinationDir = new File( outdir );

    Archiver archiver = null;
    if( zipfilePath.endsWith(".zip") ) {
        archiver = ArchiverFactory.createArchiver( ArchiveFormat.ZIP );
    } else if ( zipfilePath.endsWith(".tar.gz") ) {
        archiver = ArchiverFactory.createArchiver( ArchiveFormat.TAR, CompressionType.GZIP );
    }
    archiver.extract(archive, destinationDir);

    ArchiveStream stream = archiver.stream( archive );
    ArchiveEntry entry;

    while( (entry = stream.getNextEntry()) != null ) {
        String entryName = entry.getName();
        System.out.println("Entery Name : "+ entryName );
    }
    stream.close();
}

Maven依赖«您可以在Sonatypeorg/rauschig/jarchivelib/ Maven资源库下载jar。

<dependency>
  <groupId>org.rauschig</groupId>
  <artifactId>jarchivelib</artifactId>
  <version>0.7.1</version>
</dependency>

@see

答案 12 :(得分:0)

在Windows7上,我在Java8 Jar文件的Samba网络连接上遇到此问题&gt; 80 MBy大。将文件复制到本地驱动器可以解决问题。

答案 13 :(得分:0)

就我而言,我的android { configurations.all { resolutionStrategy.force 'com.google.firebase:firebase-core:16.0.1' } } 包含了其他不需要的jar。 例如,-Dloader.path="lib"列出了100个jar文件,但是我的mvn dependency:copy-dependencies目录中包含了101个jar文件。

答案 14 :(得分:0)

在我的情况下,具有多个版本的SL4j-api.jar在Maven存储库中发生冲突。比我删除了m2 maven repo中的整个SL4j-api文件夹并更新了maven项目,然后比在JBOSS服务器中运行该项目来构建maven项目。问题解决了。