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.
В моем случае 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>
@увидеть