web-dev-qa-db-ja.com

リリースを1つのJARファイルにマージする最も簡単な方法

[〜#〜] 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はわずかに壊れているので、修正に取り掛かります。 Mavenpom.xmlファイルも明らかに壊れていたので、jrstを修正する前にそれを修正する必要があります...私はバグ磁石のように感じます:-)


更新:このアプリケーションを修正することはできませんでしたが、太いJARに基づいた Eclipse の「Runnable JAR export wizard」をチェックアウトしました。これは、自分のコードをデプロイするのに非常に使いやすいことがわかりました。

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

70
tovare

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

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

33
Stephen Denne

Antのzipfilesetが仕事をする

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
</jar>
62
akuhn

いくつかの異なるソリューションを試してみたところ、 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」アリタスクがあります(マニフェストが「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>
27
Ashley Mercer

Maven ユーザーの場合、通常、Assemblyプラグインは必要な処理を行います。場合によっては、shadeプラグイン、場合によっては組み合わせを行います。

Assemblyプラグインを使用すると、必要な設定を使用してプロジェクトにマニフェストファイルを配置しますが、通常はデフォルトで十分です。その後、構築が完了します

mvn Assembly:assembly

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

mvn install
mvn Assembly:single

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

14
larsivi

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

8
Steve g

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

実際にJRSTツールを使用してProGuardを試しましたが、報告どおりです。問題を追跡してみましたが、jrstが参照するICU4Jライブラリの バグ に関連していることがわかりました。問題は、使用されているICUバージョンは今のところはるかに古いことです。だから私はicu.jarファイルとICU4Jバージョン3.2。 ProGuardは、JRSTのライブラリとの不整合に関する他のエラー/警告を多数見つけました。

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

8
jrudolph

(アンドリアンのものに基づく):

<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>
7
象嘉道

One-JAR 0.97は http://one-jar.sourceforge.net でリリースされたばかりで、 Spring および-などのフレームワークのサポートで拡張されました。 Guice 、これは他のアプローチに問題を引き起こす可能性があります。また、一部のJARファイルがOne-JARの外部にあるクラスローダーの反転も処理します(たとえば、 [〜#〜] jdbc [〜#〜] 出荷されない場合があるドライバー)。

One-JARはコマンドラインで、 Ant および Maven 2つのプラグインがあります。 「jar」ツールを使用してビルドするのも簡単です。

また、Ference Hechlerが書いたEclipse Jar Exporter(Runnable)をお勧めします。彼は、JARファイルのセットをラップする簡単なアプローチを考え出すのに素晴らしい仕事をしました。彼と私はOne-JARに取り組みましたが、Jar Exporterは別のコードベースに基づいています。

5
simontuffs

または、Maven Assemblyプラグイン(mvn Assembly:assembly)を使用します

3
Philip Helger

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

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

3
user7094

ここで必要なツールはJarSpliceだと思います: http://ninjacave.com/jarsplice

Ant(またはMavenを必要とし、独自のGUIを必要とし、notを実行します。使用して、要求どおりに正確に実行します->複数のjarファイルのコンテンツを単一のjarファイルにマージします(独自のクラスローダーを追加する必要があることに注意してください)。

2
Nadir

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

続きを見る:

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

0
hoang