2011-01-27 10 views
4

実行可能なjarファイルの構築に関する質問。 UI.classを含むjarファイルa.jarがあるとします。 A.jar、b.jar、およびc - 私は私が誰かにこの実行ファイルはA.jarを出荷したい場合は、私は3つのファイルを出荷する必要があり、今ネストされたjarファイル

Main-Class: UI 
Class-Path: . b.jar c.jar 

を言うアーカイブはA.jarでメタファイルを使用していました.jar。ユーザーはすべて3を同じフォルダに入れてからa.jarをダブルクリックする必要があります。 1つのファイル(a.jar)を出荷することができればもっと簡単になり、JVMはそこでb.jarとc.jarを抽出してクラスを使用することができます。これら2つは外部ライブラリであり、私はそれらを拡張して、クラスファイルをa.jarにre-jarしたくありません。

これはできますか?もしそうなら、jarコマンドとは何ですか?メタファイルには何が必要ですか?現在のコマンドは

jar cmf metafile a.jar UI.class 

ありがとうございます。

答えて

1

このツールを見ましたか?OneJar?また、thisはOneJarで読むのに良い記事です。

外部ツールを使用しない場合は、ライブラリ/ヘルパー・ジャーをマニフェストのクラスパスに入れてから、メイン・ジャーを基準にしたディレクトリ・パスにそのジャーをコピーします。

EDIT:OPはMANIFEST.MFの例を尋ねました。私はOne-Jar exampleのjarファイルの例からこれを対処しました。

Manifest-Version: 1.0 
Main-Class: com.simontuffs.onejar.Boot 
One-Jar-Expand: expand,doc 
+0

私はこれを試してみましたが、それしましたJARファイルが非常に小さい場合を除き、非常に遅いアプリケーションの起動になります。 –

+0

私はこれを試して、それを実行することはできません。問題:boot-manifest.mfファイルで、 "Main-Class:package.ClassName"を "java -jar composite.jar"を実行するとjavaを見つけることができず、行を省略してkeep "One-Jar-Main-class:package.ClassName"のみ、javaは "Main-class"エントリを持たないことを明示しています。だから私は立ち往生しています - あなたはこのファイルの様子の例を持っていますか?ありがとう、私は指摘していただきありがとうございます。 –

+0

@Manidip Sengupta:上記の私の編集をご覧ください。 – CoolBeans

0

OneJarは、いくつかのものをまとめてバンドルするのに適していますが、一般的には非常に遅く、柔軟性がありません。これはOneJarの掘り出し物ではありませんが、小さなプログラムのためにすばやく簡単に配布可能にしたいのでなければ、私はそれを使用しません。

しばらく使っていましたが、izpackに切り替えました。インストーラは、私が一般的にうまく動作することを見出した単一のjarファイルとして提供され、Windows固有のショートカットなどもサポートしています。また、antとの統合も本当に簡単です。

0

もう1つの方法は、いくつかの利用可能なツールのうちの1つを使用してセットアップ配布物を作成し、インストールパッケージをインストールするときにアプリケーションをアンパックする方法です。

1

人々が言及したようにOneJarがありますが(特にEclipseを使用している場合は)fatjarと考えることもできます。

代わりに、あなたはまた、ANTタスクを使用することによって、これを達成することができ、ここでの例です:

<target name="dist" depends="compile,static" description="Compiles and builds jar files"> 

    <mkdir dir="${dist}"/> 

    <jar destfile="${dist}/MYAPP.jar"> 
     <zipfileset src="${dist}/MY_OTHER_APP.jar"/>  
     <zipfileset src="${lib}/commons-io-1.4/commons-io-1.4.jar"/> 
     <zipfileset src="${lib}/commons-math-2.1/commons-math-2.1.jar"/> 

     <fileset dir="${res}" includes="*"/> 

     <manifest> 
      <attribute name="Main-Class" value=<where your main class is>/> 
     </manifest> 
    </jar> 
</target>