2008-11-28 5 views
51

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

java.util.zip.ZipException: ошибка в открытии архива

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

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

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

+2

Благодарим за подсказку о том, как изменить файл - что исправлено для меня. – 2010-05-04 22:24:59

+0

У меня была эта проблема на Mac, когда Windows и Linux работали нормально. Использование JarInputStream исправило проблему для меня. – 2011-12-20 09:47:34

+0

Я столкнулся с той же проблемой ** на Tomcat Start UP ** [catalina.properties]: `org.apache.catalina.startup.TldConfig tldScanJar` ПРЕДУПРЕЖДЕНИЕ: Не удалось обработать JAR [jar: ../ opensaml.jar!/] для файлов TLD `ZipException` для решения этой проблемы добавьте [opensaml. ~ .jar] (http://mvnrepository.com/artifact/org.opensaml/opensaml) в папку приложения lib. – Yash 2016-04-11 12:19:02

ответ

10

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

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

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


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

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

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


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

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

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

8

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

19

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

3

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

12

Я столкнулся с той же проблемой. У меня был архив zip, который java.util.zip.ZipFile не смог обработать, но WinRar распаковал его просто отлично.Я нашел article on 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(); 
} 
2

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

2

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

0

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

0

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

1

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

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

0

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

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

0

Просто преодолеть ZipException-х, я использовал обертку для commons-compress1.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 зависимостей «Вы можете загрузить банки из Sonatype Maven Repository на org/rauschig/jarchivelib/.

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

@see

0

На Windows7 я имел эту проблему через соединение Samba сети для Java8 Jar File> 80 мегабайта большой , Проблема с копированием файла на локальный диск.

Смежные вопросы