web-dev-qa-db-ja.com

破損したjarファイル

Eclipseを使用してWindows 7でjarファイルを作成しました。 jarファイルを開こうとすると、無効または破損したjarファイルが表示されます。 jarファイルが無効である理由を誰かが私に提案できますか?

32
Neel

これは、WindowsエクスプローラーでJARファイルをダブルクリックすると発生しますが、JAR自体は実際にはexecutable JARではありません。実際の実行可能JARは、少なくともmain()メソッドを持つクラスを持ち、MANIFEST.MFで参照される必要があります。

Eclispeでは、プロジェクトをJARファイルではなくRunnable JARファイルとしてエクスポートして、実際の実行可能JARを取得する必要があります。

または、JARが密接に関連するクラスの束(ライブラリ)のコンテナのみである場合、それをダブルクリックするのではなく、Zipツールを使用して開きます。つまり、Windowsエクスプローラーは、デフォルトでJARファイルをJava.exeに関連付けますが、これらの種類のライブラリーJARでは機能しません。

39
BalusC

これは、ZipのJARの拡張子を変更し、Zipコンテンツを抽出し、非常に一般的なケースであるMANIFEST.MFファイルの変更など、EclipseがMANIFESTファイルを何度も生成しない場合に、ファイルにいくつかの変更を加えると、定期的に発生しますまたは、CLASS-PATHまたはMAIN-CLASSの値を変更したい場合があります。

この問題は、フォルダーを圧縮するときに発生します。

有効なRunnable/Executable JARの構造は次のとおりです。

myJAR (Main-Directory)
    |-META-INF (Mandatory)
             |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
    |-com 
         |-MainClass.class (must to implement the main method, mandatory)
    |-properties files (optional)
    |-etc (optional)

JARがこれらのルールに準拠している場合、Zipツールを使用して手動でbiuldし、その後拡張子を.jarに戻しても機能しません。

完了したら、次を使用してコマンドラインで実行してください。

Java -jar myJAR.jar 

Zipツールを使用してファイルの解凍、変更、およびZipを再度行うと、通常、JAR構造がこの構造に変更されますが、これは別のディレクトリレベルがファイルシステムの上部に追加され、以下に示すように破損したファイルになるためです:

**myJAR (Main-Directory)
    |-myJAR (creates another directory making the file corrupted)**
          |-META-INF (Mandatory)
                   |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
          |-com 
              |-MainClass.class (must to implement the main method, mandatory)
          |-properties files (optional)
          |-etc (optional)

:)

18
Israelm

問題は、JARに65536個を超えるファイルがあることです: なぜJavaが多くのエントリを含むjarファイルについて文句を言うのですか? 修正については、この質問の answer で説明しています。

11
thSoft

MANIFEST.MFの問題が原因である可能性があります。メインクラスが配置されているパッケージがわかっている場合は、次のコマンドでメインクラスを開始してみてください。

Java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server
9
prayagupd

これは、エラーの「マニフェスト」に関する一般的な問題ですか?はい、よく起こります。ここにリンクがあります: http://dev-answers.blogspot.com/2006/07/invalid-or-corrupt-jarfile.html

解決策:

Antタスクを使用してその場でマニフェストファイルを作成すると、次のようなエントリが得られます。

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_07-b05 (Sun Microsystems Inc.)
Main-Class: com.example.MyMainClass

マニフェストファイルを自分で作成し、必要最低限​​のものを使用して問題を修正します。

Manifest-Version: 1.0
Main-Class: com.example.MyMainClass

さらに調査すれば、他の人が知っているように、Antで動的なメタファイルを作成できると確信しています-私のantバージョン(1.6.2)の組み合わせにはいくつかの特異性があるはずです、Javaバージョン(1.4.2_07)およびおそらく月の現在の段階。

注:

Meta-infファイルの解析は、Sunで発生し、修正されてから再び発生する問題です。参照: バグID:4991229 このバグがあなたの(または私の)バージョンのJava SEに存在する場合に解決できる場合、あなたは私より多くの忍耐を持っています。

3
Coffee

また、実行時に使用されるJavaバージョンが、コンパイル時に使用されるJavaと同等またはそれ以降のバージョンであることを確認してください

1
Mr. Whoa

MANIFEST.MFのタイプミスでもあります、p.ex。 2つの:を持つビルド日付

  Build-Date:: 2017-03-13 16:07:12
0

コマンドjar -xvf fileName.jarを使用してから、解凍したファイルのコンテンツを新しいJavaプロジェクトにEclipseにエクスポートします。

0
mcginn

たぶんこれは単なるまぐれだったかもしれませんが、このエラーが発生したときは、バックグラウンドで実行されていたすべてのjavaw.exeプロセスを強制終了する必要がありました。その後、実行可能JARが機能しました。

0
Nick Green

Jarファイルの最後に余分なバイトがある場合、7-Zipなどのエクスプローラーで開くことができますが、破損しているものとして扱われます。私は、すべてのjarファイルの末尾に1つの余分なLF文字( '\ n'、0x0a)を自動的に追加するオンラインアップロードシステムを使用しています。このようなファイルには、実行するさまざまなソリューションがあります。ファイル:

  • prayagubd のアプローチを使用し、コマンドプロンプトで.jarをクラスパスおよびメインクラスの名前として指定します。
  • ファイルの最後にある余分なバイトを削除し(16進エディターまたはhead -c -1 myjar.jarなどのコマンドを使用)、ダブルクリックするか、通常どおりJava -jar myfile.jarを使用してjarを実行します。
  • META-INFフォルダーが最上位にあることを確認しながら、拡張子を.jarから.Zipに変更し、ファイルを抽出して、.Zipファイルを再作成します。
  • .jar拡張子を.Zipに変更し、.jar内から不要なファイルを削除し、拡張子を.jarに戻します

これらのすべてのソリューションでは、.ZipおよびMETA-INFファイルの構造が本質的に正しいことが必要です。これらは、Zipの最後に1バイト余分に「破損」してテストされています。

head -c -1 *.jar > tmp.jarを2回適用することで、混乱に陥りました。 headは、ファイルの先頭にASCII text ==> myjar.jar <==]を挿入し、完全に破損しました。

0
Josiah Yoder