Подтвердить что ты не робот

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

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

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

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

Спасибо, Sandhya

4b9b3361

Ответ 1

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

Ответ 2

Я столкнулся с той же проблемой. У меня был архив zip, который java.util.zip.ZipFile не смог обработать, но WinRar распаковал его просто отлично. Я нашел статью о SDN о параметрах сжатия и распаковки в Java. Я слегка модифицировал один из примеров кода для создания метода, который, наконец, мог обрабатывать архив. Trick использует ZipInputStream вместо ZipFile и в последовательном чтении 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();
}

Ответ 3

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

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

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


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

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

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


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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

Я столкнулся с этими проблемами из-за поврежденных ZIP Fils

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

Ответ 9

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

Ответ 10

Может быть, zip файл поврежден или брошен при загрузке.

Ответ 11

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

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