2008-09-17 11 views
70

JARファイルの束を1つのJARファイルに簡単にマージするツールやスクリプトはありますか?メインファイルマニフェストを簡単に設定して実行可能にするのが特典です。リリースを1つのJARファイルにマージする最も簡単な方法

具体的なケースはJava restructured text toolです。私のようなものでそれを実行したいと思います。私の知る限り

をrst.jar -jar

のjava、それは簡単に単一であってはならないことを示している依存関係はありませんダウンロードしたZIPファイルには多くのライブラリが含まれています。

 0 11-30-07 10:01 jrst-0.8.1/ 
    922 11-30-07 09:53 jrst-0.8.1/jrst.bat 
    898 11-30-07 09:53 jrst-0.8.1/jrst.sh 
    2675 11-30-07 09:42 jrst-0.8.1/readmeEN.txt 
108821 11-30-07 09:59 jrst-0.8.1/jrst-0.8.1.jar 
    2675 11-30-07 09:42 jrst-0.8.1/readme.txt 
     0 11-30-07 10:01 jrst-0.8.1/lib/ 
    81508 11-30-07 09:49 jrst-0.8.1/lib/batik-util-1.6-1.jar 
2450757 11-30-07 09:49 jrst-0.8.1/lib/icu4j-2.6.1.jar 
559366 11-30-07 09:49 jrst-0.8.1/lib/commons-collections-3.1.jar 
    83613 11-30-07 09:49 jrst-0.8.1/lib/commons-io-1.3.1.jar 
207723 11-30-07 09:49 jrst-0.8.1/lib/commons-lang-2.1.jar 
    52915 11-30-07 09:49 jrst-0.8.1/lib/commons-logging-1.1.jar 
260172 11-30-07 09:49 jrst-0.8.1/lib/commons-primitives-1.0.jar 
313898 11-30-07 09:49 jrst-0.8.1/lib/dom4j-1.6.1.jar 
1994150 11-30-07 09:49 jrst-0.8.1/lib/fop-0.93-jdk15.jar 
    55147 11-30-07 09:49 jrst-0.8.1/lib/activation-1.0.2.jar 
355030 11-30-07 09:49 jrst-0.8.1/lib/mail-1.3.3.jar 
    77977 11-30-07 09:49 jrst-0.8.1/lib/servlet-api-2.3.jar 
226915 11-30-07 09:49 jrst-0.8.1/lib/jaxen-1.1.1.jar 
153253 11-30-07 09:49 jrst-0.8.1/lib/jdom-1.0.jar 
    50789 11-30-07 09:49 jrst-0.8.1/lib/jewelcli-0.41.jar 
324952 11-30-07 09:49 jrst-0.8.1/lib/looks-1.2.2.jar 
121070 11-30-07 09:49 jrst-0.8.1/lib/junit-3.8.1.jar 
358085 11-30-07 09:49 jrst-0.8.1/lib/log4j-1.2.12.jar 
    72150 11-30-07 09:49 jrst-0.8.1/lib/logkit-1.0.1.jar 
342897 11-30-07 09:49 jrst-0.8.1/lib/lutinwidget-0.9.jar 
2160934 11-30-07 09:49 jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar 
301249 11-30-07 09:49 jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar 
    68610 11-30-07 09:49 jrst-0.8.1/lib/sdoc-0.5.0-beta.jar 
3149655 11-30-07 09:49 jrst-0.8.1/lib/xalan-2.6.0.jar 
1010675 11-30-07 09:49 jrst-0.8.1/lib/xercesImpl-2.6.2.jar 
194205 11-30-07 09:49 jrst-0.8.1/lib/xml-apis-1.3.02.jar 
    78440 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar 
    86249 11-30-07 09:49 jrst-0.8.1/lib/xmlunit-1.1.jar 
108874 11-30-07 09:49 jrst-0.8.1/lib/xom-1.0.jar 
    63966 11-30-07 09:49 jrst-0.8.1/lib/avalon-framework-4.1.3.jar 
138228 11-30-07 09:49 jrst-0.8.1/lib/batik-gui-util-1.6-1.jar 
216394 11-30-07 09:49 jrst-0.8.1/lib/l2fprod-common-0.1.jar 
121689 11-30-07 09:49 jrst-0.8.1/lib/lutinutil-0.26.jar 
    76687 11-30-07 09:49 jrst-0.8.1/lib/batik-ext-1.6-1.jar 
124724 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar 

ご覧のとおり、手動で行う必要はありません。

これまでのところ、私はAutoJarとProGuardの両方を試してみましたが、両方とも実行するのはかなり簡単でした。 JARファイルに定数プールに関する問題があるようです。

明らかにjrstが少し壊れているので、私はそれを修正します。 Mavenpom.xmlファイルは明らかにあまりにも壊れていたので、私はjrst固定する前に...私は


更新:-)バグ磁石のように感じることを修正する必要があります:私は周りにやったことがなかった、このアプリケーションを修正します私は脂肪族のJARに基づいているEclipseの "Runnable JAR export wizard"をチェックアウトしました。私は自分自身のコードを展開するためにこれを使うのがとても簡単だとわかりました。

他の優れた提案のいくつかは、Eclipse以外の環境でビルドする方が良いかもしれませんが、ossはおそらくAntを使って素敵なビルドにするべきでしょう。

+0

http://www.jdotsoft.com/JarClassLoader.php – gorokhmn

+0

[Fat Jar Eclipse Plugin](http://fjep.sourceforge.net/) –

+0

[One-Jar](http:// one-jar。 sourceforge.net/) –

答えて

33

Eclipse 3.4 JDTのRunnable JARエクスポートウィザード。

Eclipse 3.5では、これが拡張されました。これで、参照先のJARファイルをどのように扱うかを選択できます。

+0

生成されたantスクリプトが使用可能かどうか確認できますか?相対パスの代わりに絶対ファイルパスの方が以前の問題がありました。 –

14

あなたがMavenユーザの場合、通常、アセンブリプラグインは、あなたが望むもの、あるいは陰影のプラグイン、場合によっては組み合わせを行います。

アセンブリプラグインでは、マニフェストファイルをプロジェクトに任意の設定で配置しますが、デフォルトは通常はかなり良いです。その後、建物は、

mvn assembly:assembly 

で処理されます。それ以上の特別なことがある場合は、他の目標の1つがあります。インクルードするすべてのJARファイルは、Mavenの依存関係リゾルバによって取得されます。あなたは日陰のプラグインを使用している場合、それは通常、インストールの目標の一部であり、ある特定のプロジェクトで私が今やっている私assembly:singleの目標は、この場合には、寿命の問題を回避することである

mvn install 
mvn assembly:single 

行いますSpringアプリケーション。

-4

Apache Antのようなサウンドは、あなたが探しているものです。

3

autojarというツールがあります。バイトコードをスキャンし、見つかったクラス(参照されたクラス)を含む.jarファイルをコンパイルします。

ただし、Springのようなもので動作するとは限りませんが、コンフィグレーションでクラス名を指定し、フレームワークによってロードされます。

+0

ポインタをありがとう、この特定のアプリケーションのいくつかの.jarsは私にこれを行う頭痛を与えているようだ。 – tovare

27

いくつかの解決策を試した結果、私はOne-JARが最も簡単であり、それを正確に行うことができました。必要なものすべてを含む実行可能な単一のJARを生成します。

One-JARは、ネストされたリソースをナビゲートできるカスタムクラスローダーを使用します。マニフェストは、次のようになりますので、メインクラスであることがjrst-0.8.1.jarにorg.codelutin.jrst.JRSTのように見え、ダウンロード中の.batファイルを見てください:

Main-Class: com.simontuffs.onejar.Boot 
One-Jar-Main-Class: org.codelutin.jrst.JRST 

本当にクールなことは、One-JARがあなたのためにコマンドライン引数を渡すことを処理するということです。必要なすべてのリソースが単一のJARにバンドルされていると仮定して、クラスパスはカスタムクラスローダーによって処理されます。

One-JARを使用する最も簡単な方法はantです。次のように動作するカスタム「一瓶」Antタスク(あなたのマニフェストは「rst.mf」と呼ばれていると仮定)があります:

<target name="jar-rst"> 
    <one-jar destfile="rst.jar" manifest="rst.mf"> 
     <main jar="jrst-0.8.1.jar" /> 
     <lib> 
      <fileset dir="${pathToJars}"> 
       <include name="batik-util-1.6-1.jar" /> 
       <include name="icu4j-2.6.1.jar" /> 
       <include name="commons-collections-3.1.jar" /> 
       <!-- Snip --> 
      </fileset> 
     </lib> 
    </one-jar> 
</target> 
+1

antを使用したone-jarのスクリプティング機能は、連続ビルドシステムで使用できるようにします。 –

+0

1.私のjarファイル内にいくつかのアプリケーション(いくつかのエントリーポイントクラス)がある場合、One-JARは使えますか? 2.このJARが別のアプリケーションで使用されている場合、 "One-JAR"内のネストされたJARクラスも使用できますか? – MRalwasser

8

1にあなたのJARファイルをパックが、そればかりでなくProGuardがありますクラスファイルを最適化、クリーンアップ、または難読化することもできます。その結果、生成されたJARファイルは以前のすべてのJARファイルの合計よりもずっと小さくなります。

JRSTツールで実際にProGuardを試しましたが、これは報告した通りです。私は問題を追跡しようとしましたが、これはjrstが参照するICU4Jライブラリのa bugに関連しています。問題は、使用されたICUのバージョンが現在では時代遅れであるということです。そこで、icu.jarファイルをICU4Jバージョン3.2に置き換えました。 ProGuardは、JRSTのライブラリとの不一致に関する他のエラーや警告を発見しました。

私の予想では、ProGuardは期待通りに動作しますが、jrstのライブラリは一貫していません。プロジェクトの依存関係を確認して更新する必要があるため、開発者と話す以上に多くのことができるかどうかは分かりません。

+0

ありがとう!私はそれをダウンロードして試しましたが、この特定の分野では、icu4j-2.6.1.jarの未知定数フィールド、 – tovare

3

やMavenアセンブリプラグイン(MVN組立:組立)を使用して

8

あなたのJARファイルは、他の人と競合しないことを確認するためにパッケージシャドウイングを使用するどのJarJarを使用することができます。

+0

+1で爆撃しました。簡単に使用し、素晴らしい作品。 – Eelco

63

Antのzipfilesetは仕事をしていません

<jar id="files" jarfile="all.jar"> 
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/> 
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/> 
</jar> 
+1

+1これはタグを追加してメインクラスを設定することもできるためです。 – Shirkrin

+0

ディレクトリ内のすべてのjarファイルに対して、これを何らかの形で行うことは可能でしょうか。非常にきちんとしているだろう。ライブラリが変更されたときにbuild.xmlを更新する必要はありません。 –

+3

このアプローチを試してみると、新しいJARの追加について心配する必要はありません:https://github.com/anupamsaini/Trie/blob/master/src/build.xml#L42 –

5

ワンJAR 0.97だけhttp://one-jar.sourceforge.netでリリースされている、それは他のアプローチに迷惑を提示することができるようにSpringGuiceなどのフレームワークのサポートWIH拡張されました。クラスローダの逆変換も処理されます.JARファイルはOne-JARの外部にあります(たとえば、同梱されていないドライバJDBC)。

One-JARは、コマンドラインで、AntMavenの2つのプラグインを使用します。また、「jar」ツールを使用するだけで簡単に構築できます。

Ference Hechlerが書いたEclipse Jar Exporter(Runnable)をお勧めします。彼はJARファイルのラップを作成する簡単な方法を考え出しました。彼と私はOne-JARで作業しましたが、Jarエクスポータは別のコードベースに基づいています。 (アンドリアーノさんに基づく)

+0

+1 JAR用... –

+0

+1ジャーの場合は+1、Mavenサポートの場合は-1 – Manius

7

<jar id="files" jarfile="all.jar"> 
    <zipgroupfileset dir="${library.dir}" includes="*.jar" excludes="test-helper.jar"/> 
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/> 
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/> 
    <fileset dir="."> 
    <include name="LICENSE"/> 
    <include name="NOTICE"/> 
    </fileset> 
</jar> 
2

私はあなたがここに必要なツールがJarSpliceであることを考える:http://ninjacave.com/jarsplice

それは、を行いますではAntまたはMavenが必要ではなく、独自のGUIを持っています。あなたが尋ねたことを使い、正確に行う - >それはいくつかのjの内容をマージしますarファイルを1つのファイルに置き換えます(独自のクラスローダーを追加する必要があります)。