Eclipseを使用してWindows 7でjarファイルを作成しました。 jarファイルを開こうとすると、無効または破損したjarファイルが表示されます。 jarファイルが無効である理由を誰かが私に提案できますか?
これは、WindowsエクスプローラーでJARファイルをダブルクリックすると発生しますが、JAR自体は実際にはexecutable JARではありません。実際の実行可能JARは、少なくともmain()
メソッドを持つクラスを持ち、MANIFEST.MF
で参照される必要があります。
Eclispeでは、プロジェクトをJARファイルではなくRunnable JARファイルとしてエクスポートして、実際の実行可能JARを取得する必要があります。
または、JARが密接に関連するクラスの束(ライブラリ)のコンテナのみである場合、それをダブルクリックするのではなく、Zipツールを使用して開きます。つまり、Windowsエクスプローラーは、デフォルトでJARファイルをJava.exe
に関連付けますが、これらの種類のライブラリーJARでは機能しません。
これは、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)
:)
問題は、JARに65536個を超えるファイルがあることです: なぜJavaが多くのエントリを含むjarファイルについて文句を言うのですか? 修正については、この質問の answer で説明しています。
MANIFEST.MF
の問題が原因である可能性があります。メインクラスが配置されているパッケージがわかっている場合は、次のコマンドでメインクラスを開始してみてください。
Java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server
これは、エラーの「マニフェスト」に関する一般的な問題ですか?はい、よく起こります。ここにリンクがあります: 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に存在する場合に解決できる場合、あなたは私より多くの忍耐を持っています。
また、実行時に使用されるJavaバージョンが、コンパイル時に使用されるJavaと同等またはそれ以降のバージョンであることを確認してください
MANIFEST.MF
のタイプミスでもあります、p.ex。 2つの:
を持つビルド日付
Build-Date:: 2017-03-13 16:07:12
コマンドjar -xvf fileName.jarを使用してから、解凍したファイルのコンテンツを新しいJavaプロジェクトにEclipseにエクスポートします。
たぶんこれは単なるまぐれだったかもしれませんが、このエラーが発生したときは、バックグラウンドで実行されていたすべてのjavaw.exeプロセスを強制終了する必要がありました。その後、実行可能JARが機能しました。
Jarファイルの最後に余分なバイトがある場合、7-Zipなどのエクスプローラーで開くことができますが、破損しているものとして扱われます。私は、すべてのjarファイルの末尾に1つの余分なLF文字( '\ n'、0x0a)を自動的に追加するオンラインアップロードシステムを使用しています。このようなファイルには、実行するさまざまなソリューションがあります。ファイル:
head -c -1 myjar.jar
などのコマンドを使用)、ダブルクリックするか、通常どおりJava -jar myfile.jar
を使用してjarを実行します。これらのすべてのソリューションでは、.ZipおよびMETA-INFファイルの構造が本質的に正しいことが必要です。これらは、Zipの最後に1バイト余分に「破損」してテストされています。
head -c -1 *.jar > tmp.jar
を2回適用することで、混乱に陥りました。 head
は、ファイルの先頭にASCII text ==> myjar.jar <==
]を挿入し、完全に破損しました。