util - comprimir varios archivos en un zip con java
java.util.zip.ZipException: error al abrir el archivo zip (13)
Tengo un archivo Jar, que contiene otros tarros anidados. Cuando invoco el nuevo constructor JarFile()
en este archivo, recibo una excepción que dice:
java.util.zip.ZipException: error al abrir el archivo zip
Cuando manualmente descomprimo el contenido de este archivo jar y lo vuelvo a comprimir, funciona bien.
Solo veo esta excepción en WebSphere 6.1.0.7 y versiones superiores. Lo mismo funciona bien en tomcat y WebLogic.
Cuando uso JarInputStream en lugar de JarFile, puedo leer el contenido del archivo Jar sin ninguna excepción.
Asegúrese de que su archivo jar no esté dañado. Si está dañado o no se puede descomprimir, se producirá este error.
En Windows 7 tuve este problema sobre una conexión de red Samba para un Java8 Jar File> 80 MBytes grande. Copiar el archivo en una unidad local solucionó el problema.
Estaba recibiendo una excepción
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)
...
al descomprimir un archivo en Java. El archivo en sí no parecía estar dañado ya que 7zip (y otros) lo abrieron sin ningún problema o queja sobre CRC inválido.
Cambié a Apache Commons Compress por leer las entradas zip y eso resolvió el problema.
He visto esta excepción anteriormente cuando no se puede acceder a lo que la JVM considere un directorio temporal debido a que no está allí o no tiene permiso para escribir.
Liquibase estaba obteniendo este error para mí. Resolví esto después de depurar y observé que liquibase intentaba cargar las bibliotecas y descubrí que estaba cometiendo un error en los archivos de manifiesto de commons-codec-1.6.jar. Esencialmente, hay un archivo zip corrupto en algún lugar de su ruta o hay una versión incompatible que se utiliza. Cuando hice una exploración en el repositorio de Maven para esta biblioteca, encontré que había versiones más nuevas y agregué la versión más nueva al pom.xml. Pude proceder en este punto.
Lo resolví borrando los directorios jboss-xyz / server [config] / tmp y jboss-xyz / server / [config] / work.
Me enfrenté a este problema debido a las corruptas ZIP Fils
Compruebe si su archivo JAR se descargó completamente
Me enfrenté al mismo problema. Tenía un archivo zip que java.util.zip.ZipFile no podía manejar pero WinRar lo desempaquetó muy bien. Encontré un artículo sobre SDN sobre cómo comprimir y descomprimir las opciones en Java. Modifiqué ligeramente uno de los códigos de ejemplo para producir un método que finalmente fue capaz de manejar el archivo. El truco está en utilizar ZipInputStream en lugar de ZipFile y en la lectura secuencial del archivo zip. Este método también es capaz de manejar archivos comprimidos vacíos. Creo que puede ajustar el método para satisfacer sus necesidades, ya que todas las clases zip tienen subclases equivalentes para los archivos .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();
}
Podría estar relacionado con log4j.
¿Tiene el archivo log4j.jar en la vía de acceso de clases de websphere java (como se define en el archivo de inicio), así como el classpath de la aplicación?
Si se asegura de que el archivo log4j.jar esté en el classpath de java y que NO esté en el directorio web-inf / lib de su aplicación web.
También se puede relacionar con la versión ant (puede que no sea su caso, pero lo pongo aquí como referencia):
Usted tiene un archivo .class en su ruta de clases (es decir, no un directorio o un archivo .jar). Comenzando con la hormiga 1.6, ant abrirá los archivos en la ruta de clases verificando entradas de manifiesto. Este intento de apertura fallará con el error "java.util.zip.ZipException"
El problema no existe con ant 1.5 ya que no intenta abrir los archivos. - así que asegúrese de que su classpath no contenga archivos .class.
En una nota lateral, ¿consideraron tener jarras separadas ?
Podrías en el manifiesto de tu jar principal, referirte a los otros jar con este atributo:
Class-Path: one.jar two.jar three.jar
Luego, coloque todos sus frascos en la misma carpeta.
Una vez más, puede no ser válido para su caso, pero sigue ahí para referencia.
Simplemente para superar la ZipException, he usado un contenedor para commons-compress
1.14 llamado jarchivelib
escrito por thrau que hace que sea fácil de extraer o comprimir desde y hacia objetos File.
Ejemplo:
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();
}
Dependencia de Maven «Puede descargar los org/rauschig/jarchivelib/ Repositorio Sonatype Maven en org/rauschig/jarchivelib/ .
<dependency>
<groupId>org.rauschig</groupId>
<artifactId>jarchivelib</artifactId>
<version>0.7.1</version>
</dependency>
@ver
Tal vez el archivo zip esté dañado o se haya interrumpido durante la descarga.
También veo este error cuando estoy sin espacio en el disco en el sistema de archivos al que está escribiendo. Entonces puede darle más espacio, limpiar archivos de registro, etc.
Vi esto con un Zip-archivo específico con Java 6, pero desapareció cuando actualicé a Java 8 (no probé Java 7), por lo que parece que las versiones más nuevas de ZipFile en Java soportan más algoritmos de compresión y por lo tanto pueden leer archivos que fallar con versiones anteriores.