我有一个Jar文件,其中包含其他嵌套的Jar。当我JarFile()
在该文件上调用新的构造函数时,出现一个异常:
java.util.zip.ZipException:打开zip文件时出错
当我手动解压缩此Jar文件的内容并再次将其压缩时,它可以正常工作。
我仅在WebSphere 6.1.0.7和更高版本上看到此异常。同样的东西在tomcat和WebLogic上也可以正常工作。
当我使用JarInputStream代替JarFile时,我可以毫无例外地读取Jar文件的内容。
我有一个Jar文件,其中包含其他嵌套的Jar。当我JarFile()
在该文件上调用新的构造函数时,出现一个异常:
java.util.zip.ZipException:打开zip文件时出错
当我手动解压缩此Jar文件的内容并再次将其压缩时,它可以正常工作。
我仅在WebSphere 6.1.0.7和更高版本上看到此异常。同样的东西在tomcat和WebLogic上也可以正常工作。
当我使用JarInputStream代替JarFile时,我可以毫无例外地读取Jar文件的内容。
org.apache.catalina.startup.TldConfig tldScanJar
警告:无法处理TLD文件的JAR [jar:../ opensaml.jar!/]ZipException
以解决此问题,将opensaml。〜.jar添加到应用程序库中夹。
Answers:
确保您的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();
}
zis.close(); fis.close();
应该在finally子句中-duh(或对资源使用try)
它可能与log4j有关。
您在Websphere Java类路径(在启动文件中定义)以及应用程序类路径中是否有log4j.jar文件?
如果确实要确保log4j.jar文件在java类路径中,并且不在Webapp的web-inf / lib目录中。
它也可以与ant版本相关(可能不是您的情况,但是我在这里做参考):
您的类路径中有一个.class文件(即没有目录或.jar文件)。从ant 1.6开始,ant将打开类路径中的文件以检查清单条目。尝试打开将失败,并显示错误“ java.util.zip.ZipException”
蚂蚁1.5不存在此问题,因为它不会尝试打开文件。-因此,请确保您的类路径不包含.class文件。
附带说明一下,您是否考虑过使用单独的罐子?
您可以在主jar的清单中,引用具有此属性的其他jar:
Class-Path: one.jar two.jar three.jar
然后,将所有罐子放在同一文件夹中。
同样,对于您的情况可能无效,但仍然可以作为参考。
Liquibase为我得到了这个错误。在调试并观看liquibase尝试加载库后,我解决了此问题,并发现它在commons-codec-1.6.jar的清单文件中出错。本质上,路径中某个地方的zip文件已损坏,或者正在使用不兼容的版本。当我在Maven存储库中对该库进行浏览时,我发现有较新的版本,并将较新的版本添加到pom.xml中。我现在可以继续进行了。
我正在例外
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的,我已经使用的包装1.14所谓书面thrau,可以很容易提取或压缩从进入File对象。commons-compress
jarchivelib
例:
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存储库中的org / rauschig / jarchivelib /下载jar 。
<dependency>
<groupId>org.rauschig</groupId>
<artifactId>jarchivelib</artifactId>
<version>0.7.1</version>
</dependency>
@看到