web-dev-qa-db-fra.com

java.util.Zip.ZipException: erreur lors de l'ouverture du fichier Zip

J'ai un fichier Jar, qui contient d'autres Jars imbriqués. Lorsque j'appelle le nouveau constructeur JarFile() sur ce fichier, je reçois une exception indiquant:

Java.util.Zip.ZipException: erreur lors de l'ouverture du fichier Zip

Lorsque je décompresse manuellement le contenu de ce fichier Jar et que je le décompresse à nouveau, cela fonctionne bien.

Je ne vois cette exception que sur WebSphere 6.1.0.7 et les versions ultérieures. La même chose fonctionne bien sur Tomcat et WebLogic. 

Lorsque j'utilise JarInputStream au lieu de JarFile, je peux lire le contenu du fichier Jar sans aucune exception.

66
Sandhya Agarwal

Assurez-vous que votre fichier JAR n'est pas corrompu. Si elle est corrompue ou incapable de décompresser, cette erreur se produira.

25
arulraj.net

J'ai rencontré le même problème. J’avais une archive Zip que Java.util.Zip.ZipFile n’était pas capable de gérer mais WinRar l’a bien décompressée. J'ai trouvé article sur SDN à propos des options de compression et de décompression en Java. J'ai légèrement modifié l'un des exemples de codes pour produire une méthode capable de gérer les archives. L'astuce consiste à utiliser ZipInputStream au lieu de ZipFile et à lire séquentiellement l'archive Zip. Cette méthode est également capable de gérer une archive Zip vide. Je pense que vous pouvez adapter la méthode à vos besoins car toutes les classes Zip ont des sous-classes équivalentes pour les archives .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();
}
15
JohnyCash

Cela pourrait être lié à log4j.

Avez-vous un fichier log4j.jar dans le chemin d'accès aux classes Websphere Java (tel que défini dans le fichier de démarrage) ainsi que dans le chemin d'accès aux classes de l'application?

Si vous vous assurez que le fichier log4j.jar se trouve dans le chemin de classe Java et qu'il ne se trouve pas dans le répertoire web-inf/lib de votre application Web.


Cela peut aussi être lié à la version ant (ce n'est peut-être pas votre cas, mais je le mets ici pour référence):

Vous avez un fichier .class dans votre chemin de classe (c'est-à-dire pas un répertoire ou un fichier .jar). À partir de ant 1.6, ant ouvrira les fichiers du chemin de classe en recherchant les entrées de manifeste. Cette tentative d'ouverture échouera avec l'erreur "Java.util.Zip.ZipException"

Le problème n'existe pas avec ant 1.5 car il n'essaye pas d'ouvrir les fichiers. - assurez-vous que votre classpath ne contient pas de fichiers .class.


Sur une note de côté, avez-vous envisagé de bocaux séparés ?
Vous pouvez, dans le manifeste de votre bocal principal, vous reporter aux autres bocaux avec cet attribut:

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

Ensuite, placez tous vos pots dans le même dossier.
Encore une fois, peut-être pas valable pour votre cas, mais toujours là pour référence.

10
VonC

J'ai déjà vu cette exception lorsque tout ce que la machine virtuelle Java considère comme un répertoire temp n'est pas accessible car il n'existe pas ou n'a pas l'autorisation d'écrire. 

8
Artur...

J'ai résolu ce problème en effaçant les répertoires jboss-x.y.z/server [config]/tmp et jboss-x.y.z/server/[config]/work.

3
Marius K

J'ai fait face à ces problèmes à cause de Corrupted Zip Fils

Vérifiez si votre fichierJARa été téléchargé complètement

3

Je vois aussi cette erreur lorsque je manque d'espace disque sur le système de fichiers sur lequel il écrit. Vous pouvez donc lui donner plus d’espace, nettoyer les fichiers journaux, etc.

2
Tant4lus

J'ai vu cela avec un fichier Zip spécifique avec Java 6, mais il a disparu lors de la mise à niveau vers Java 8 (je n'ai pas testé Java 7). Il semble donc que les versions plus récentes de ZipFile en Java prennent en charge davantage d'algorithmes de compression et permettent ainsi de lire des fichiers qui échouer avec les versions précédentes.

2
centic

Dans mon cas, mon -Dloader.path="lib" contient d'autres fichiers JAR qui n'ont pas besoin de . Par exemple, mvn dependency:copy-dependencies répertorie 100 fichiers JAR, mais mon répertoire lib contient 101 fichiers JAR.

0
hatanooh

Sur Windows7, je rencontrais ce problème avec une connexion réseau Samba pour un fichier Jar Java8 de plus de 80 Mo. La copie du fichier sur un lecteur local a résolu le problème.

0
Wolfgang Fahl

Je devenais une exception

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

lors de la décompression d’une archive en Java. Les archives elles-mêmes ne semblaient pas corrompues car 7Zip (et d'autres) l'ouvraient sans problèmes ni réclamations concernant un CRC non valide.

Je suis passé à Apache Commons Compress pour lire les entrées Zip et cela a résolu le problème.

0
radoh

Peut-être que le fichier Zip est endommagé ou est cassé lors du téléchargement. 

0
Michael Yang

Pour surmonter les exceptions ZipException, j'ai utilisé un wrapper pour commons-compress1.14 appelé jarchivelibécrit par thrau cela facilite l'extraction ou la compression à partir d'objets File.

Exemple:

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

Dépendance Maven «Vous pouvez télécharger les fichiers jar à partir du répertoire Sonatype Maven à l’adresse org/rauschig/jarchivelib/ .

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

@voir

0
Yash

Liquibase obtenait cette erreur pour moi. J'ai résolu ce problème après avoir débogué et vu que Liquibase essayait de charger les bibliothèques et découvrais qu'il s'agissait d'une erreur dans les fichiers de manifeste de commons-codec-1.6.jar. Essentiellement, il existe soit un fichier Zip corrompu quelque part dans votre chemin, soit une version incompatible utilisée. Lorsque j'ai exploré le référentiel Maven pour cette bibliothèque, j'ai découvert des versions plus récentes et ajouté la version la plus récente au fichier pom.xml. J'ai pu procéder à ce stade. 

0
iowatiger08