Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.zip.ZipException:打开zip文件时出错_Java_Zip_Unzip - Fatal编程技术网

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

java.util.zip.ZipException:打开zip文件时出错,java,zip,unzip,Java,Zip,Unzip,我有一个Jar文件,其中包含其他嵌套的Jar。当我在这个文件上调用新的JarFile()构造函数时,我得到一个异常,它说: java.util.zip.ZipException:打开zip文件时出错 当我手动解压缩这个Jar文件的内容并再次将其压缩时,它工作得很好 我仅在WebSphere6.1.0.7及更高版本上看到此异常。同样的事情在tomcat和WebLogic上也可以正常工作 当我使用JarInputStream而不是JarFile时,我能够毫无例外地读取Jar文件的内容。它可能与log

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

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

当我手动解压缩这个Jar文件的内容并再次将其压缩时,它工作得很好

我仅在WebSphere6.1.0.7及更高版本上看到此异常。同样的事情在tomcat和WebLogic上也可以正常工作


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

它可能与log4j有关

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

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


它也可能与(可能不是您的情况,但我确实把它放在这里作为参考):

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

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


旁白,你考虑过了吗?< BR> 您可以在主jar的清单中,使用以下属性引用其他jar:

Class-Path: one.jar two.jar three.jar
然后,将所有罐子放在同一个文件夹中。

同样,可能对您的情况无效,但仍有参考价值。

我以前见过这样的例外情况,JVM认为是临时目录的内容由于不在那里或没有写入权限而无法访问

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

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

我也遇到了同样的问题。我有一个java.util.zip.ZipFile无法处理的zip归档文件,但WinRar将其解包后就可以了。我在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();
}

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

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

我遇到了一个例外

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的投诉的情况下打开档案时,档案本身似乎没有损坏


我切换到读取zip条目,这就解决了问题。

为了克服ZipException的问题,我使用了一个名为write by的包装器,可以轻松地从文件对象中提取或压缩到文件对象中

例如:

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 dependency«您可以从Maven存储库下载JAR,网址为


org.rauschig


    • 在Windows7上,我在Samba网络连接上遇到了这个问题,因为Java8JAR文件的大小大于80MB。将文件复制到本地驱动器修复了该问题。

      在我的情况下,我的
      -Dloader.path=“lib”
      包含其他不需要的JAR。
      例如,
      mvn dependency:copy dependencies
      列出了100个jar文件。但是我的
      lib
      目录包含101个jar文件。

      在我的例子中,多个版本的SL4j-api.jar在maven repo中是冲突的。然后我删除了m2 maven repo中的整个SL4j api文件夹,并更新了maven项目,构建了maven项目,然后在JBOSS服务器中运行了该项目。问题得到了解决。

      谢谢你关于重新压缩文件的提示——这对我来说已经解决了。当Windows和Linux运行正常时,我在Mac上遇到了这个问题。使用JarInputStream为我解决了这个问题。我在Tomcat启动[catalina.properties]时遇到了同样的问题:
      org.apache.catalina.startup.TldConfig tldScanJar
      警告:无法处理JAR[JAR:../opensaml.JAR!/]对于TLD文件
      ZipException
      ,要解决此问题,请将其添加到应用程序库文件夹。似乎与操作系统有关。使用Java 8时,我的一个JAR可以从MacOS和Linux中读取,但不能从Windows 7中读取。jar大约是80mbytes。旧的jar在相同的windows7上可读性很好。有更好的调试选项。非常感谢您的回复。但是,我在WebSphereJava类路径中没有log4j.jar;fis.close()应该在finally子句中-duh(或使用try with resources)这解决了我完全相同的问题!问题是使用ZipFile而不是ZipInputStream!谢谢