87

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

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

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

我只在 WebSphere 6.1.0.7 及更高版本上看到此异常。同样的事情在 tomcat 和 WebLogic 上也能正常工作。

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

4

12 回答 12

29

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

于 2010-09-27T07:14:11.140 回答
19

我遇到了同样的问题。我有一个 java.util.zip.ZipFile 无法处理的 zip 存档,但 WinRar 将其解压缩得很好。我在 SDN 上找到了关于 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();
}
于 2011-09-22T01:48:37.800 回答
10

当 JVM 认为是临时目录由于不存在或没有写入权限而无法访问时,我已经看到过这个异常。

于 2008-11-28T17:50:02.283 回答
9
于 2008-11-28T07:16:35.083 回答
3

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

于 2011-02-08T17:34:10.490 回答
2

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

于 2015-04-23T19:44:17.907 回答
0

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

于 2015-06-09T14:10:40.690 回答
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 条目并解决了问题。

于 2017-03-30T12:32:03.670 回答
0

就我而言,我-Dloader.path="lib"包含其他不需要的罐子。例如,mvn dependency:copy-dependencies列出 100 个 jar 文件。但我的lib目录包含 101 个 jar 文件。

于 2018-08-16T06:05:44.367 回答
0

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

于 2020-03-14T04:26:28.340 回答
0

为了克服 ZipException 的问题,我使用了1.14的包装器,由 thrau 编写可以轻松地从文件对象中提取或压缩。commons-compressjarchivelib

例子:

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 依赖项 «您可以从Sonatype Maven 存储库的org/rauschig/jarchivelib/下载 jars 。

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

@看

于 2018-02-14T13:28:29.037 回答
0

在 Windows7 上,我在 Samba 网络连接上遇到了 Java8 Jar 文件 >80 MB 大的问题。将文件复制到本地驱动器解决了这个问题。

于 2018-02-24T07:21:30.520 回答