java.util.zip.ZipException: ошибка при открытии zip-файла - PullRequest
70 голосов
/ 28 ноября 2008

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

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

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

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

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

Ответы [ 14 ]

26 голосов
/ 27 сентября 2010

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

16 голосов
/ 22 сентября 2011

Я столкнулся с той же проблемой. У меня был 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();
}
10 голосов
/ 28 ноября 2008

Может быть связано с 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.


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

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

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

8 голосов
/ 28 ноября 2008

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

3 голосов
/ 23 марта 2017

Я столкнулся с этой проблемой из-за испорченного ZIP Fils

Проверьте, был ли загружен файл JAR Полностью

3 голосов
/ 08 февраля 2011

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

2 голосов
/ 23 апреля 2015

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

2 голосов
/ 23 сентября 2014

Я также вижу эту ошибку, когда мне не хватает места на диске в файловой системе, в которую она записывает Таким образом, вы можете выделить больше места, очистить файлы журналов и т. Д.

0 голосов
/ 16 августа 2018

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

0 голосов
/ 24 февраля 2018

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

...