web-dev-qa-db-ja.com

java.util.Zip.ZipException:Zipファイルを開く際のエラー

他のネストされたJarを含むJarファイルがあります。このファイルで新しいJarFile()コンストラクターを呼び出すと、次のような例外が発生します。

Java.util.Zip.ZipException:Zipファイルを開く際のエラー

このJarファイルの内容を手動で解凍し、再度圧縮すると、正常に機能します。

この例外は、WebSphere 6.1.0.7以降のバージョンでのみ表示されます。同じことがTomcatとWebLogicでも問題なく機能します。

JarFileの代わりにJarInputStreamを使用すると、例外なくJarファイルの内容を読み取ることができます。

71
Sandhya Agarwal

Jarファイルが破損していないことを確認してください。破損しているか、解凍できない場合、このエラーが発生します。

26
arulraj.net

私は同じ問題に直面しました。 Java.util.Zip.ZipFileが処理できないZipアーカイブがありましたが、WinRarはそれをうまく解凍しました。私は SDNに関する記事 Javaのオプションの圧縮と解凍について見つけました。サンプルコードの1つを少し変更して、最終的にアーカイブを処理できるメソッドを生成しました。トリックは、ZipFileの代わりにZipInputStreamを使用し、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();
}
16
JohnyCash

Log4jに関連している可能性があります。

Websphere Javaクラスパス(起動ファイルで定義)およびアプリケーションクラスパスにlog4j.jarファイルがありますか?

Log4j.jarファイルがJavaクラスパスにあり、webappのweb-inf/libディレクトリにないことを確認してください。


また、 ant version (あなたの場合ではないかもしれませんが、私は参照のためにここにそれを置きます)と関連することができます:

クラスパスに.classファイルがあります(つまり、ディレクトリまたは.jarファイルではありません)。 ant 1.6以降、antはクラスパス内のファイルを開き、マニフェストエントリをチェックします。この開こうとした試みは、エラー「Java.util.Zip.ZipException」で失敗します

Ant 1.5では、ファイルを開こうとしないため、問題は存在しません。 -したがって、クラスパスに.classファイルが含まれていないことを確認してください。


余談ですが、 separate jars にすることを検討しましたか?
メインjarのマニフェストで、この属性を持つ他のjarを参照できます。

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

次に、すべてのjarを同じフォルダーに入れます。
再び、あなたのケースでは有効ではないかもしれませんが、参照のためにそこにあります。

10
VonC

JVMがtempであるとみなすものが存在しないか、書き込み権限がないためにアクセスできない場合に、この例外を見たことがある。

8
Artur...

Jboss-x.y.z/server [config]/tmpおよびjboss-x.y.z/server/[config]/workディレクトリをクリアすることでこれを解決しました。

3
Marius K

破損したため、この問題に直面しましたZip Fils

JARファイルが完全にダウンロードされたかどうかを確認します

また、書き込み先のファイルシステムのディスク領域が不足しているときにもこのエラーが表示されます。そのため、より多くのスペースを割り当てたり、ログファイルをクリーンアップしたりできます。

2
Tant4lus

Java 6の特定のZipファイルでこれを見ましたが、Java 8にアップグレードすると消えました(Java 7をテストしませんでした)。 JavaのZipFileの新しいバージョンはより多くの圧縮アルゴリズムをサポートしているため、以前のバージョンで失敗したファイルを読み取ることができます。

2
centic

私の場合、-Dloader.path="lib"には必要のない他のjarが含まれています。たとえば、mvn dependency:copy-dependenciesは100個のjarファイルをリストしますが、私のlibディレクトリには101個のjarファイルが含まれています。

0
hatanooh

Windows7では、80 MBを超えるJava8 JarファイルのSambaネットワーク接続でこの問題が発生しました。ファイルをローカルドライブにコピーすると、問題が修正されました。

0
Wolfgang Fahl

私は例外になっていました

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に関する問題や苦情なしに開いたため、破損しているようには見えませんでした。

Zipエントリを読み取るために Apache Commons Compress に切り替えて、問題を解決しました。

0
radoh

Zipファイルが破損しているか、ダウンロード時に壊れている可能性があります。

0
Michael Yang

ZipExceptionを克服するために、 commons-compress のラッパーを使用しました。1.14 呼ばれる jarchivelibthra によって書かれました これにより、Fileオブジェクトから、または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リポジトリ org/rauschig/jarchivelib / からjarをダウンロードできます。

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

@見る

0
Yash

Liquibaseはこのエラーを受け取っていました。デバッグしてliquibaseがライブラリをロードしようとするのを見て、commons-codec-1.6.jarのマニフェストファイルでエラーが発生していることを確認した後、これを解決しました。基本的に、パスのどこかに破損したZipファイルがあるか、使用されている互換性のないバージョンがあります。このライブラリのMavenリポジトリで調査を行ったときに、新しいバージョンがあることがわかり、pom.xmlに新しいバージョンを追加しました。この時点で進めることができました。

0
iowatiger08