it-swarm.com.de

java.util.Zip.ZipException: Fehler beim Öffnen der Zip-Datei

Ich habe eine Jar-Datei, die andere verschachtelte Gläser enthält. Wenn ich den neuen JarFile()-Konstruktor für diese Datei aufrufe, erhalte ich eine Ausnahme, die besagt:

Java.util.Zip.ZipException: Fehler beim Öffnen der Zip-Datei

Wenn ich den Inhalt dieser Jar-Datei manuell entpacke und sie erneut mit dem Zip-Befehl verschlüssle, funktioniert das einwandfrei.

Diese Ausnahme wird nur in WebSphere 6.1.0.7 und höheren Versionen angezeigt. Das Gleiche funktioniert gut mit Tomcat und WebLogic. 

Wenn ich JarInputStream anstelle von JarFile verwende, kann ich den Inhalt der Jar-Datei ausnahmslos lesen.

66
Sandhya Agarwal

Stellen Sie sicher, dass Ihre JAR-Datei nicht beschädigt ist. Wenn es beschädigt ist oder nicht entpackt werden kann, tritt dieser Fehler auf.

25
arulraj.net

Ich hatte das gleiche Problem. Ich hatte ein Zip-Archiv, das Java.util.Zip.ZipFile nicht verarbeiten konnte, aber WinRar entpackte es einfach. Ich habe Artikel über SDN über das Komprimieren und Dekomprimieren von Optionen in Java gefunden. Ich habe einen der Beispielcodes leicht modifiziert, um eine Methode zu erstellen, die das Archiv schließlich handhaben konnte. Trick verwendet ZipInputStream anstelle von ZipFile und sequenzielles Lesen des Zip-Archivs. Diese Methode kann auch ein leeres Zip-Archiv verarbeiten. Ich glaube, Sie können die Methode an Ihre Bedürfnisse anpassen, da alle Zip-Klassen entsprechende Unterklassen für .jar-Archive haben. 

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();
}
15
JohnyCash

Es könnte sich um log4j handeln.

Verfügen Sie über die Datei log4j.jar im Java-Klassenpfad von websphere (wie in der Startdatei definiert) sowie über den Klassenpfad der Anwendung?

Wenn Sie sicherstellen, dass sich die Datei log4j.jar im Java-Klassenpfad befindet und NICHT im Verzeichnis web-inf/lib Ihrer Webanwendung.


Es kann auch mit der ant Version verwandt sein (möglicherweise ist es nicht Ihr Fall, aber ich stelle es hier als Referenz):

Sie haben eine .class-Datei in Ihrem Klassenpfad (d. H. Kein Verzeichnis oder eine .jar-Datei). Beginnend mit ant 1.6 öffnet ant die Dateien im Klassenpfad und sucht nach Manifesteinträgen. Dieser versuchte Versuch wird mit dem Fehler "Java.util.Zip.ZipException" fehlschlagen.

Das Problem existiert nicht mit ant 1.5, da nicht versucht wird, die Dateien zu öffnen. - Stellen Sie daher sicher, dass Ihre Klassenpfade keine .class-Dateien enthalten.


Haben Sie in Betracht gezogen, getrennte Gläser zu haben?
Sie könnten sich im Manifest Ihres Hauptgefäßes auf die anderen Gefäße mit diesem Attribut beziehen:

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

Dann legen Sie alle Gläser in den gleichen Ordner.
Auch möglicherweise nicht für Ihren Fall gültig, aber immer noch als Referenz.

10
VonC

Ich habe diese Ausnahme schon einmal gesehen, wenn auf das, was die JVM für ein temp -Verzeichnis hält, nicht zugegriffen werden kann, weil sie nicht vorhanden ist oder keine Schreibberechtigung hat. 

8
Artur...

Ich habe dieses Problem gelöst, indem ich die Verzeichnisse jboss-x.y.z/server [config]/tmp und jboss-x.y.z/server/[config]/work gelöscht habe.

3
Marius K

Ich habe dieses Problem wegen beschädigter ZipFils-Dateien festgestellt

Prüfen Sie, ob IhreJAR-Datei vollständig heruntergeladen wurde

Ich sehe diesen Fehler auch, wenn auf dem Dateisystem, auf das geschrieben wird, kein Speicherplatz mehr vorhanden ist. So können Sie entweder mehr Speicherplatz zuweisen, Protokolldateien bereinigen usw.

2
Tant4lus

Ich habe dies mit einer bestimmten Zip-Datei mit Java 6 gesehen, die jedoch beim Upgrade auf Java 8 verschwunden ist (Java 7 wurde nicht getestet), daher scheinen neuere Versionen von ZipFile in Java mehr Kompressionsalgorithmen zu unterstützen und somit Dateien lesen zu können scheitern mit früheren Versionen.

2
centic

In meinem Fall enthält mein -Dloader.path="lib" andere Gläser, die nicht benötigt werden. mvn dependency:copy-dependencies listet 100 JAR-Dateien auf. Mein lib-Verzeichnis enthält jedoch 101 JAR-Dateien.

0
hatanooh

Unter Windows7 hatte ich dieses Problem über eine Samba-Netzwerkverbindung für eine Java8-Jar-Datei> 80 MByte groß. Durch das Kopieren der Datei auf ein lokales Laufwerk wurde das Problem behoben.

0
Wolfgang Fahl

Ich bekam eine Ausnahme

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)
...

beim Entpacken eines Archivs in Java. Das Archiv selbst schien nicht beschädigt zu sein, da 7Zip (und andere) es ohne Probleme oder Beschwerden über ungültige CRC geöffnet haben.

Ich habe zu Apache Commons Compress gewechselt, um die Zip-Einträge zu lesen, und das Problem wurde behoben.

0
radoh

Möglicherweise ist die Zip-Datei beschädigt oder beim Herunterladen beschädigt. 

0
Michael Yang

Um die ZipException zu überwinden, habe ich einen Wrapper für commons-compress verwendet.1.14 genannt jarchivelibgeschrieben von thrau Dies erleichtert das Extrahieren oder Komprimieren von und in File-Objekte.

Beispiel:

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-Abhängigkeit «Sie können die Gläser vom Sonatype Maven Repository unter org/rauschig/jarchivelib/ herunterladen.

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

@sehen

0
Yash

Liquibase bekam diesen Fehler für mich. Ich löste das Problem, nachdem ich debuggen und gesehen habe, wie liquibase versucht, die Bibliotheken zu laden, und stellte fest, dass in den Manifest-Dateien für commons-codec-1.6.jar ein Fehler aufgetreten ist. Im Wesentlichen befindet sich entweder eine beschädigte Zip-Datei in Ihrem Pfad oder es wird eine inkompatible Version verwendet. Als ich das Maven-Repository für diese Bibliothek durchforschte, fand ich neuere Versionen und fügte die neuere Version zur pom.xml hinzu. Ich konnte an dieser Stelle weitermachen. 

0
iowatiger08