75

多数のJARファイルを1つのJARファイルに簡単にマージするツールまたはスクリプトはありますか?ボーナスは、メインファイルマニフェストを簡単に設定して実行可能にすることです。

具体的なケースは、Javaで再構築されたテキストツールです。私はそれを次のようなもので実行したいと思います:

java -jar rst.jar

私の知る限り、依存関係はなく、簡単な単一ファイルツールではないはずですが、ダウンロードした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が少し壊れているので、修正してみます。Maven ファイルも明らかに壊れていたpom.xmlので、jrstを修正する前にそれを修正する必要があります...私はバグマグネットのように感じます:-)


更新:このアプリケーションを修正することはできませんでしたが、ファットJARに基づくEclipseの「実行可能なJARエクスポートウィザード」を確認しました。これは、自分のコードをデプロイするのに非常に使いやすいことがわかりました。

他の優れた提案のいくつかは、Eclipse以外の環境でのビルドに適している可能性があります。おそらく、 Antを使用して優れたビルドを作成する必要があります。(Maven、これまでのところ私に苦痛を与えたばかりですが、他の人はそれを愛しています。)

4

13 に答える 13

62

Ant'szipfilesetは仕事をします

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</jar>
于 2008-10-08T22:09:10.747 に答える
34

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

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

于 2008-09-17T09:08:56.760 に答える
27

いくつかの異なるソリューションを試してみた結果、One-JAR が最も使いやすく、まさにそれを実現することができました。つまり、必要なものがすべて含まれた単一の実行可能な JAR を生成することができました。

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

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

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

One-JAR を使用する最も簡単な方法は、ant を使用することです。次のように機能するカスタムの「1 つの jar」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>
于 2008-09-17T09:32:54.317 に答える
14

Mavenユーザーの場合、通常、アセンブリプラグインは必要な処理を実行するか、場合によってはシェードプラグイン、場合によっては組み合わせを実行します。

アセンブリプラグインを使用すると、必要な設定を使用してマニフェストファイルをプロジェクトに配置できますが、通常、デフォルトは非常に適切です。その後、構築は次のように行われます。

mvn assembly:assembly

または、もっと特別なことに対処する必要がある場合は、他の目標の1つです。含めるすべてのJARファイルは、Mavenの依存関係リゾルバーによって取得されます。シェードプラグインを使用する場合、それは通常、インストール目標の一部であり、現在行っている特定のプロジェクトでは、

mvn install
mvn assembly:single

目標は、この場合はSpringアプリケーションassembly:singleで、ライフタイムの問題を回避することです。

于 2008-09-17T08:57:37.147 に答える
9

JARファイルを1つにパックするだけでなく、クラスファイルを最適化、クリーンアップ、または難読化して、結果のJARファイルを以前のすべてのJARファイルの合計よりもはるかに小さくするProGuardがあります.

実際にJRSTツールでProGuardを試してみましたが、ご報告の通りです。問題を追跡しようとしたところ、jrst が参照する ICU4J ライブラリのバグに関連していることがわかりました。問題は、使用されている ICU のバージョンが現在かなり古いことです。そこで、icu.jarファイルを ICU4J バージョン 3.2 に置き換えました。現在、ProGuard は、JRST のライブラリとの不一致に関するその他のエラー/警告を多数検出します。

私の推測では、ProGuard は期待どおりに動作しますが、jrst のライブラリには一貫性がありません。プロジェクトの依存関係をチェックして更新する必要があるため、開発者と話す以上のことができるかどうかはわかりません。

于 2008-09-17T09:38:10.467 に答える
8

パッケージのシャドウイングを使用するJarJarを使用して、JAR ファイルが他のファイルと競合しないようにすることができます。

于 2008-09-22T16:10:31.877 に答える
7

(Andrian に基づく):

<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>
于 2011-04-13T16:46:43.703 に答える
5

One-JAR 0.97 がhttp://one-jar.sourceforge.netでリリースされたばかりで、 SpringGuiceなどのフレームワークをサポートするように拡張されているため、他のアプローチでは問題が発生する可能性があります。また、一部の JAR ファイルが One-JAR の外部にあるクラスローダー反転も処理します (たとえば、バンドルされていないJDBCドライバー)。

One-JAR はコマンドラインで、AntおよびMaven 2 プラグインを使用します。また、「jar」ツールを使用するだけで簡単にビルドできます。

また、Ference Hechler が書いた Eclipse Jar Exporter (Runnable) もお勧めできます。彼は、一連の JAR ファイルをラップするための単純なアプローチを考え出すという素晴らしい仕事をしました。彼と私は One-JAR で作業しましたが、Jar Exporter は別のコードベースに基づいています。

于 2010-07-17T07:17:22.050 に答える
3

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

ただし、構成でクラス名を指定すると、フレームワークによってロードされる Spring のようなものでは常に機能するとは限りません。

于 2008-09-17T08:59:07.580 に答える
3

または、Maven アセンブリ プラグイン (mvn assembly:assembly) を使用する

于 2008-09-17T09:40:03.753 に答える
0

これを行うには、maven シェーディング プラグインを使用する必要があります。私はスタンドアロンの jar ファイルをビルドするために maven をよく使用しますが、これは非常に強力です。

続きを見る:

http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

于 2014-06-12T16:31:34.663 に答える
-4

探しているのはApache Antのようです。

于 2008-09-17T08:58:03.590 に答える