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


76

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

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

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

我仅在WebSphere 6.1.0.7和更高版本上看到此异常。同样的东西在tomcat和WebLogic上也可以正常工作。

当我使用JarInputStream代替JarFile时,我可以毫无例外地读取Jar文件的内容。


3
感谢您提供有关重新压缩文件的提示-该问题已为我修复。
布莱恩·拉森

当Windows和Linux运行正常时,我在Mac上遇到了这个问题。使用JarInputStream为我解决了这个问题。
鲍里斯·范舒滕2011年

在Tomcat启动[catalina.properties]遇到了相同的问题:org.apache.catalina.startup.TldConfig tldScanJar警告:无法处理TLD文件的JAR [jar:../ opensaml.jar!/]ZipException以解决此问题,将opensaml。〜.jar添加到应用程序库中夹。
Yash

似乎是OS的依赖。使用Java 8,MacOS和Linux可以读取我的一个jar,而Windows 7则无法读取。jar约为80 MB。较旧的jar在相同的Windows 7上可读性也很好。为此,将有更好的调试选项。
Wolfgang Fahl

Answers:


27

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


17

我遇到了同样的问题。我有一个zip归档文件,java.util.zip.ZipFile无法处理,但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();
}

3
zis.close(); fis.close();应该在finally子句中-duh(或对资源使用try)
Mr_and_Mrs_D 2015年

10

它可能与log4j有关。

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

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


它也可以与ant版本相关(可能不是您的情况,但是我在这里做参考):

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

蚂蚁1.5不存在此问题,因为它不会尝试打开文件。-因此,请确保您的类路径不包含.class文件。


附带说明一下,您是否考虑过使用单独的罐子
您可以在主jar的清单中,引用具有此属性的其他jar:

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

然后,将所有罐子放在同一文件夹中。
同样,对于您的情况可能无效,但仍然可以作为参考。


非常感谢您的回复。但是,我在Websphere Java类路径中没有log4j.jar。
Sandhya Agarwal

9

我之前已经见过这种异常,因为由于不存在或没有写权限而无法访问JVM认为是临时目录的任何内容。


3

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


2

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


0

Liquibase为我得到了这个错误。在调试并观看liquibase尝试加载库后,我解决了此问题,并发现它在commons-codec-1.6.jar的清单文件中出错。本质上,路径中某个地方的zip文件已损坏,或者正在使用不兼容的版本。当我在Maven存储库中对该库进行浏览时,我发现有较新的版本,并将较新的版本添加到pom.xml中。我现在可以继续进行了。


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条目,从而解决了该问题。


0

在Windows7上,对于大于80 MB的Java8 Jar文件,我通过Samba网络连接遇到了此问题。将文件复制到本地驱动器可解决此问题。


0

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


0

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


-1

只要克服抛出:ZipException的,我已经使用的包装1.14所谓书面thrau,可以很容易提取或压缩从进入File对象。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 /下载jar 。

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

@看到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.