java.util.zip.ZipException: ошибка при открытии zip-файла

У меня есть файл Jar, который содержит другие вложенные Jar-файлы. Когда я вызываю новый конструктор JarFile() в этом файле, я получаю исключение, в котором говорится:

java.util.zip.ZipException: ошибка при открытии zip-файла

Когда я вручную разархивирую содержимое этого Jar-файла и снова заархивирую его, он работает нормально.

Я вижу это исключение только в WebSphere 6.1.0.7 и более поздних версиях. То же самое отлично работает на tomcat и WebLogic.

Когда я использую JarInputStream вместо JarFile, я могу читать содержимое файла Jar без каких-либо исключений.


person Sandhya Agarwal    schedule 28.11.2008    source источник
comment
Спасибо за подсказку о повторном архивировании файла - это исправлено для меня.   -  person Bryan Larsen    schedule 05.05.2010
comment
У меня была эта проблема на Mac, когда Windows и Linux работали нормально. Использование JarInputStream устранило проблему для меня.   -  person Boris van Schooten    schedule 20.12.2011
comment
Я столкнулся с той же проблемой при запуске Tomcat [catalina.properties]: org.apache.catalina.startup.TldConfig tldScanJar ПРЕДУПРЕЖДЕНИЕ: Не удалось обработать JAR [jar: ../ opensaml.jar! /] Для файлов TLD ZipException, чтобы решить эту проблему добавьте opensaml. ~ .jar в папку библиотеки приложения.   -  person Yash    schedule 11.04.2016
comment
Кажется, зависит от ОС. С Java 8 один из моих jar-файлов читается в MacOS и Linux, но не в Windows 7. Размер jar-файла составляет около 80 МБ. Старые jar-файлы прекрасно читаются в той же Windows 7. Что бы для этого было лучше.   -  person Wolfgang Fahl    schedule 24.02.2018


Ответы (12)


Убедитесь, что ваш jar-файл не поврежден. Если он поврежден или не может быть разархивирован, возникнет эта ошибка.

person arulraj.net    schedule 27.09.2010

Я столкнулся с той же проблемой. У меня был 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();
}
person JohnyCash    schedule 22.09.2011
comment
zis.close(); fis.close(); должен быть в предложении finally - да (или используйте try с ресурсами) - person Mr_and_Mrs_D; 14.12.2015
comment
Это решит мою точно такую ​​же проблему! Проблема заключалась в использовании ZipFile вместо ZipInputStream! Спасибо большое ‹3 - person CrazyProg; 25.11.2020

Это может быть связано с log4j.

У вас есть файл log4j.jar в пути к классам java websphere (как определено в файле запуска), а также в пути к классам приложения?

Если вы убедитесь, что файл log4j.jar находится в пути к классам java, а НЕ в каталоге web-inf / lib вашего веб-приложения.


Это также может быть связано с версия муравья (может быть, не в вашем случае, но я помещаю ее здесь для справки):

У вас есть файл .class в пути к вашему классу (т.е. не каталог или файл .jar). Начиная с ant 1.6, ant будет открывать файлы в пути к классам, проверяя наличие записей манифеста. Эта попытка открытия завершится неудачно с ошибкой java.util.zip.ZipException

Проблема не возникает с ant 1.5, так как он не пытается открыть файлы. - поэтому убедитесь, что ваш путь к классам не содержит файлов .class.


Кстати, рассматривали ли вы возможность использования отдельных jar-файлов?
Вы можете в манифесте вашего основного jar-файла ссылаться на другие jar-файлы с этим атрибутом:

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

Затем поместите все свои банки в одну папку.
Опять же, это может не подходить для вашего случая, но все же существует для справки.

person VonC    schedule 28.11.2008
comment
Большое спасибо за ваш ответ. Однако у меня нет log4j.jar в пути к классам Java websphere. - person Sandhya Agarwal; 23.02.2011

Я видел это исключение раньше, когда все, что JVM считает каталогом temp, недоступно из-за того, что его там нет или нет разрешения на запись.

person Artur...    schedule 28.11.2008

Я решил эту проблему, очистив каталоги jboss-x.y.z / server [config] / tmp и jboss-x.y.z / server / [config] / work.

person Marius K    schedule 08.02.2011

Я видел это с определенным Zip-файлом с Java 6, но он исчез, когда я обновился до Java 8 (не тестировал Java 7), поэтому кажется, что более новые версии ZipFile в Java поддерживают больше алгоритмов сжатия и, следовательно, могут читать файлы, которые не работают с более ранними версиями.

person centic    schedule 23.04.2015

Liquibase получал эту ошибку для меня. Я решил эту проблему после того, как отладил и посмотрел, как Liquibase пытается загрузить библиотеки, и обнаружил, что это ошибка в файлах манифеста для commons-codec-1.6.jar. По сути, либо где-то на вашем пути есть поврежденный zip-файл, либо используется несовместимая версия. Когда я исследовал репозиторий Maven для этой библиотеки, я обнаружил, что есть более новые версии, и добавил новую версию в pom.xml. На этом этапе я смог продолжить.

person iowatiger08    schedule 09.06.2015

Я получал исключение

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-записей, и это устранило проблему.

person radoh    schedule 30.03.2017

Просто чтобы преодолеть ZipException, я использовал оболочку для commons-compress < href = "https://mvnrepository.com/artifact/org.apache.commons/commons-compress/1.14" rel = "nofollow noreferrer"> 1.14 с именем _ 2_ написано thrau, который упрощает извлечение или сжатие из файловых объектов и в них.

Пример:

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 «Вы можете загрузить jar-файлы из Sonatype репозитория Maven по адресу org / rauschig / jarchivelib /.

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

@видеть

person Yash    schedule 14.02.2018

В Windows7 у меня была эта проблема с сетевым подключением Samba для файла Jar Java8 размером> 80 МБ. Копирование файла на локальный диск устранило проблему.

person Wolfgang Fahl    schedule 24.02.2018

В моем случае мой -Dloader.path="lib" содержит другие ненужные баночки. например, mvn dependency:copy-dependencies перечисляет 100 файлов jar. но мой каталог lib содержит 101 файл jar.

person hatanooh    schedule 16.08.2018

В моем случае SL4j-api.jar с несколькими версиями конфликтуют в репозитории maven. Затем я удалил всю папку SL4j-api в репозитории m2 maven и обновил проект maven, построил проект maven, чем запустил проект на сервере JBOSS. проблема решена.

person Shaik Elias    schedule 14.03.2020