1

Eclipseで小さなJavaアプリケーションを作成しました。IDEから実行可能なjarを作成しているときは、すべてが正常に機能しています。しかし、どういうわけか私はそれをターミナル経由で作成することができません(私はMacを使用しています)。

以下は私のプロジェクトディレクトリ構造です

./bin (Contains all compiled classes)
./lib (Contains all the third party lib I am using lib1.jar,lib2.jr, lib3.jar)
./src (Contains my java class = myProject.java)
manifest.txt (Contains 2 line, first line is Main-Class:myProject and second line is empty)

以下は、クラスのコンパイルに使用したコマンドです。

javac -d bin -sourcepath src -cp lib/lib1.jar:lib/lib2.jar:lib/lib3.jar src/myProject.java

jarファイルを作成するには、次のコマンドを使用しています

jar cvfm myProject.jar manifest.txt bin/*.class lib/*.jar

このコマンドを実行すると、無効なヘッダーフィールドが表示されます。以下は完全なエラーメッセージです。

java.io.IOException: invalid header field
    at java.util.jar.Attributes.read(Attributes.java:393)
    at java.util.jar.Manifest.read(Manifest.java:180)
    at java.util.jar.Manifest.<init>(Manifest.java:50)
    at sun.tools.jar.Main.run(Main.java:149)
    at sun.tools.jar.Main.main(Main.java:1147)

どこが間違っているのかわかりません。誰かが私が犯している間違いや、もっと何かをする必要があるかどうかを指摘できますか?

前もって感謝します。

4

2 に答える 2

1

ここでは、 JARファイル仕様が役立ちます。

「無効なヘッダーフィールド」メッセージの背後にある問題は、ヘッダーフィールドの値が空白で始まらなければならないことだと思います。manifest.txt含むようにしてください

Main-Class: myProject

代わりは。

ファイル内のクラスへのアクセスに関してはlib/*.jar、Javaはjarファイル内のjarファイル内のクラスを検出しません。実際lib/*.jarには、jarコマンドラインでの指定をスキップできます。

ここに2つの可能性があります:

  • 追加

    Class-Path: lib/lib1.jar lib/lib2.jar lib/lib3.jar
    

    manifest.txt。これの欠点は、jarを配布し、ライブラリjarが正しい相対パスにない場合、ClassNotFoundErrorが発生することです。

  • すべての.classファイルを内部lib/*.jarから一時ディレクトリに解凍し、に追加しますmyProject.jar。これの利点は、jarファイルが完全に自己完結型であるということです。欠点は、ファイルが大きくなり、複雑になり、作成に時間がかかることです。次の行に沿ってシェルスクリプトを使用できます。

    mkdir lib/expanded
    cd lib/expanded
    for J in ../*.jar; do
        unzip "${J}"
        rm -rf META-INF
    done
    zip -R ../../myProject.jar *
    cd .. && rm -rf expanded
    

    ディレクトリは、各ファイルMETA-INFを抽出した後に削除されるため、上書きするかどうかを尋ねられたり、のマニフェストが上書きされたりすることはありません。lib/*.jarunzipmyProject.jar

于 2012-11-12T22:12:05.933 に答える
0

jar manfileを読んで、次のようなことを試すことができると思います。

jar cvmfe manifest.txt myProjecy.jar myProject bin/*.class lib/*.jar

myProjectエントリクラス名はどこにありますか。それがうまくいかない場合は、-mオプションを削除してみてください。とにかく、オプションはMainClassエントリを取得する必要があるmanifest.txtと思います。-e

于 2012-11-12T22:15:53.053 に答える