87

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

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

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

この例外は、WebSphere 6.1.0.7 以降のバージョンでのみ発生します。同じことが tomcat と WebLogic でもうまくいきます。

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

4

12 に答える 12

29

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

于 2010-09-27T07:14:11.140 に答える
19

私は同じ問題に直面しました。java.util.zip.ZipFile が処理できなかった zip アーカイブがありましたが、WinRar は問題なく解凍しました。Java でのオプションの圧縮と解凍に関する SDN の記事を見つけました。サンプル コードの 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();
}
于 2011-09-22T01:48:37.800 に答える
10

この例外は、JVMが一時ディレクトリであると見なすものがないか、書き込み権限がないためにアクセスできない場合に、以前に見たことがあります。

于 2008-11-28T17:50:02.283 に答える
9

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

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

log4j.jar ファイルが Java クラスパスにあり、Web アプリケーションの web-inf/lib ディレクトリにないことを確認してください。


ant バージョンに関連している可能性もあります (あなたの場合ではないかもしれませんが、参考のためにここに記載します)。

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

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


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

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

次に、すべての jar を同じフォルダーに配置します。
繰り返しますが、あなたの場合には有効ではないかもしれませんが、参照用に残っています。

于 2008-11-28T07:16:35.083 に答える
3

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

于 2011-02-08T17:34:10.490 に答える
2

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

于 2015-04-23T19:44:17.907 に答える
0

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

于 2015-06-09T14:10:40.690 に答える
0

単純に ZipException を克服するために、File オブジェクトからの抽出や File オブジェクトへの圧縮を容易にするthrauによって記述された1.14のラッパーを使用しました。commons-compressjarchivelib

例:

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 依存関係 « org/rauschig/jarchivelib/ の Sonatype Mavenリポジトリから jar をダウンロードできます。

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

@見る

于 2018-02-14T13:28:29.037 に答える