ひとつの jar ファイルに依存する jar ファイルをすべて含める 〜 Jar Jar Links

ひとつの jar ファイルにすべての依存する jar ライブラリを含める方法ないかと探していたところ Jar Jar Links というツールを見つけました。

Jar Jar Links は Java のライブラリを簡単に再パッケージして独自の配布用 jar ファイルに埋め込むツールです。実際には ant の「jar」タスクのラッパータスクとして実装されていています。デフォルトの「jar」タスクの代わりに使う事によって依存ライブラリ群をひとつの jar にまとめることができるので、利用者のシステム側でライブラリがインストールされているかどうかを気にせずにプログラムを配布することができます。

Jar Jar Links を使ったビルドファイルの記述時のポイントは

  1. で Jar Jar Links を使った新しいタスクを定義する
  2. 「jar」タスクの代わりに定義した新しいタスクを使って jar の作成内容を記述する。
  3. 配布用 jar ファイルに含めたい jar ライブラリを を使って指定する。

以下のサンプルを参考にしてください。

通常の場合のサンプル ant ビルドファイル
<?xml version="1.0" ?>
<project name="myapp" default="jar" basedir=".">

  <property name="dest.dir" value="build/classes"/>
  <property name="dist.dir" value="."/>
  <property name="lib.dir" value="lib"/>

  <target name="jar">
    <jar jarfile="${dist.dir}/myapp.jar" basedir="${dest.dir}" includes="**/*.class" >
      <manifest>
         <attribute name="Main-Class" value="MyApp"/>
         <attribute name="Class-Path" value="required-lib.jar" />
     </manifest>
    </jar>
  </target>

</project>
Jar Jar Links を使った場合のサンプル ant ビルドファイル
<?xml version="1.0" ?>
<project name="myapp" default="jar" basedir=".">

  <property name="dest.dir" value="build/classes"/>
  <property name="dist.dir" value="."/>
  <property name="lib.dir" value="lib"/>

  <target name="jar" >
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" 
          classpath="${lib.dir}/jarjar-1.0.jar"/>
    <jarjar jarfile="${dist.dir}/myapp.jar" basedir="${dest.dir}" includes="**/*.class" >
      <manifest>
         <attribute name="Main-Class" value="MyApp"/>
         <attribute name="Class-Path" value="required-lib.jar" />
      </manifest>
       <zipfileset src="${lib.dir}/required-lib.jar" />
    </jarjar>
  </target>

</project>

上記の jarjar-1.0.jar ファイルは "Jar Jar Link のダウンロードページ" からダウロードできます。

ほとんど、通常の jar タスクと同じようにビルドファイルをかけるのが分かるかと思います。


※もちろんライブラリの配布元がこのような形での再配布を認めているかどうか?というのは別問題ですので、ご自分のものでないライブラリを含める場合は再配布の条件を確認して下さいね。