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

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

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

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

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

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

14 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

Возможно, zip-файл поврежден или поврежден при загрузке.

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

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

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

Чтобы преодолеть исключение ZipException, я использовал оболочку для commons-compress 1.14 называется jarchivelib написанный thrau, который облегчает извлечение или сжатие из и в объекты File.

Пример:

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>

@увидеть

Другие вопросы по тегам