java.util.zip.zipexception: Fout bij het openen van zipbestand

Ik heb een JAR-bestand, dat andere geneste potten bevat. Toen ik de nieuwe JarFile()Constructor op dit bestand oproept, krijg ik een uitzondering die zegt:

java.util.zip.zipexception: Fout bij het openen van zipbestand

Wanneer ik de inhoud van dit JAR-bestand handmatig uitputten en opnieuw opdagen, werkt het prima.

Ik zie alleen deze uitzondering op WebSphere 6.1.0.7 en hogere versies. Hetzelfde werkt prima op Tomcat en Weblogic.

Wanneer ik JarinPutstream gebruik in plaats van Jarfile, kan ik de inhoud van het JAR-bestand zonder uitzonderingen lezen.


Antwoord 1, Autoriteit 100%

Zorg ervoor dat uw JAR-bestand niet is beschadigd. Als het beschadigd is of niet in staat is om uit te pakken, zal deze fout optreden.


Antwoord 2, Autoriteit 70%

Ik heb geconfronteerd met hetzelfde probleem. Ik had een zip-archief die Java.Util.zip.zipfile niet in staat was om aan te pakken, maar WinRar uitgepakt het prima. Ik vond artikel op SDN over comprimerende en decompressie-opties in Java. Ik heb een van de voorbeeldcodes enigszins gewijzigd om de methode te produceren die uiteindelijk in staat was om het archief te verwerken. Trick is in het gebruik van ZipinPutstream in plaats van Zipfile en in sequentiële aflezing van ZIP-archief. Deze methode is ook in staat om lege zip-archief te hanteren. Ik geloof dat u de methode kunt aanpassen aan uw behoeften omdat alle zipklassen gelijkwaardige subclasses hebben voor .jar-archieven.

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

Antwoord 3, Autoriteit 37%

het kan gerelateerd zijn aan Log4J.

Heeft u Log4j.jar-bestand in de WebSphere Java ClassPath (zoals gedefinieerd in het opstartbestand) en het toepassingsklassePad?

Als u ervoor zorgt dat het bestand Log4j.jar in het Java ClassPath is en dat het niet in de Web-Inf / Lib-map van uw webapp is.


Het kan ook gerelateerd zijn aan de mierenversie (kan niet jouw zaak zijn, maar ik doe het hier voor referentie):

U hebt een .class-bestand in uw Class Path (d.w.z. niet een map of een .jar-bestand). Beginnend met ANT 1.6, opent Ant de bestanden in de ClassPath-controle voor manifeste inzendingen. Deze poging tot opening zal falen met de fout “java.util.zip.zipexception”

Het probleem bestaat niet met ant 1.5 omdat het niet probeert de bestanden te openen. – zorg er dus voor dat uw klassenpaden geen .class-bestanden bevatten.


Terzijds, heb je overwogen om afzonderlijke potten?
U kunt in het manifest van uw hoofdpot verwijzen naar de andere potten met dit kenmerk:

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

Plaats vervolgens al je potten in dezelfde map.
Nogmaals, het is misschien niet geldig voor uw geval, maar is er nog steeds ter referentie.


Antwoord 4, autoriteit 37%

Ik heb deze uitzondering eerder gezien wanneer wat de JVM beschouwt als een tempdirectory niet toegankelijk is vanwege het niet aanwezig zijn of geen toestemming hebben om te schrijven.


Antwoord 5, autoriteit 11%

Ik heb dit opgelost door de mappen jboss-x.y.z/server[config]/tmp en jboss-x.y.z/server/[config]/work te wissen.


Antwoord 6, autoriteit 7%

Ik zag dit met een specifiek Zip-bestand met Java 6, maar het ging weg toen ik upgrade naar Java 8 (heb Java 7 niet getest), dus het lijkt erop dat nieuwere versies van ZipFile in Java meer compressie-algoritmen ondersteunen en dus kunnen lees bestanden die bij eerdere versies mislukken.


Antwoord 7

Liquibase kreeg deze foutmelding voor mij. Ik loste dit op nadat ik foutopsporing had gedaan en zag hoe liquibase de bibliotheken probeerde te laden en ontdekte dat er fouten werden gemaakt in de manifestbestanden voor commons-codec-1.6.jar. In wezen is er ergens op uw pad een beschadigd zip-bestand of wordt er een incompatibele versie gebruikt. Toen ik de Maven-repository voor deze bibliotheek deed, ontdekte ik dat er nieuwere versies waren en voegde de nieuwere versie toe aan de pom.xml. Op dit punt kon ik verder.


Antwoord 8

Ik kreeg een uitzondering

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

bij het uitpakken van een archief in Java. Het archief zelf leek niet beschadigd aangezien 7zip (en anderen) het zonder problemen of klachten over ongeldige CRC opende.

Ik ben overgestapt op Apache Commons Compressvoor het lezen van de zip-entries en dat is opgelost het probleem.


Antwoord 9

Om de ZipException’s te omzeilen, heb ik een wrapper gebruikt voor commons-compress1.14genaamd jarchivelibgeschreven door thraudie het gemakkelijk maakt om objecten uit en in Bestandsobjecten te extraheren of te comprimeren.

Voorbeeld:

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-afhankelijkheid « U kunt de potten downloaden van de SonatypeMaven-repository op org/rauschig/jarchivelib/.

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

@see


Antwoord 10

In Windows7 had ik dit probleem via een Samba-netwerkverbinding voor een Java8 Jar-bestand van 80 MByte groot. Het kopiëren van het bestand naar een lokale schijf loste het probleem op.


Antwoord 11

In mijn geval, mijn -Dloader.path="lib"bevat andere potten die niet nodig hebben.
Bijvoorbeeld, mvn dependency:copy-dependenciesLijsten 100 JAR-bestanden.maar mijn libDirectory bevat 101 kruikbestanden.


Antwoord 12

In mijn geval zijn SL4J-API.JAR met meerdere versies conflicterend in de Maven Repo. Dan heb ik de hele SL4J-API-map in M2 Maven Repo en bijgewerkt Maven-project, Build Maven Project dan het project in Jboss Server. probleem is opgelost.

Other episodes