TITLE:AntのJarタスクで実行可能なJarファイルの作成

AntのJarタスクで実行可能なJarファイルの作成

編集者:Terai Atsuhiro
作成日:2003-09-25
更新日:2018-10-30 (火) 16:43:34

概要

Antを使って、Windows環境などでダブルクリックすると起動するJarファイルを作成します。

サンプルターゲット

<target name="package" depends="compile">
 <echo message="Creating the jar file ${build.dir}/${name}.jar"/>
 <tstamp>
  <format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
 </tstamp>
 <jar jarfile="${build.dir}/${name}.jar" basedir="${build.dest}">
  <manifest>
   <attribute name="Main-Class" value="${main.class}"/>
   <attribute name="Class-Path" value="${runtime.classpath}"/>
   <attribute name="Implementation-Title"   value="${Name}"/>
   <attribute name="Implementation-Version" value="${version}"/>
   <attribute name="Implementation-Vendor"  value="${vendor}"/>
   <attribute name="Build-Id"
    value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])"/>
  </manifest>
 </jar>
</target>

解説

Swing以下のsrc.zipなどで、サンプルをダウンロードすることができます。

${main.class}、${runtime.classpath}などのプロパティは、config 以下にある、build.properties properties.xmlファイルを編集して環境に合わせて修正してください。サンプル中のbuild.xmlでは、コンパイルや実行に必要なjarファイルがあれば、libフォルダ以下に置いておくと自動的にクラスパスに追加されます。

#build.propertiesファイル
#メインクラス(jarファイルのマニフェストに使用)
main.class=example.MainPanel
#クラスパス(jarファイルのマニフェストに使用、区切りは半角スペース)
runtime.classpath=. lib/test.jar hoge.jar

このサンプルでは、src\javaフォルダ以下にShift_JIS(Windows-31J)のソースファイルを置いて使用します。

以下のように、packageターゲットでantを実行すると、jarファイルが作成されます。

ant package

Antを使わない場合は、以下のようなmanifest.txtを作って、

Main-Class: demo
Class-Path: SampleLib.jar

以下のように、jar.exeで作成します。

> jar -cvfm hogehoge.jar manifest.txt demo.class

ただ、マニフェスト・ファイルを手で書くと、:の後には半角スペースが必要だったり、最終行末に改行がないとおかしくなるなど、いろいろ面倒があるみたいです。

コメント

  • 参照するjarファイルが多い場合は、pathconvertタスクを使ってマニュフェストのクラスパスを自動生成するのが楽です --
    • たしかに数が多いと大変そうですね。上記のpackageターゲットをpathconvertタスクを使うようにすると以下のみたいな感じでしょうか*1。 -- terai
      <pathconvert pathsep=" " dirsep="/" property="jar.runtime.classpath">
        <path>
          <pathelement location="${build.dir}" />
        </path>
        <map from="${build.dir}" to="."/>
      </pathconvert>
      <target name="jarpath" if="have.library">
        <path id="jar.path">
          <pathelement location="${build.dir}" />
          <fileset dir="${lib.dir}">
            <include name="*.jar" />
          </fileset>
        </path>
        <!-- lib.dirは相対パスで指定しているので、これを絶対パスに変換 -->
        <!-- これは、あとでmapを使ってjar.pathから絶対パスを削るため -->
        <pathconvert property="lib.path">
          <path path="${lib.dir}" />
        </pathconvert>
        <echo message="-------------------------- ${lib.path}" />
        <pathconvert pathsep=" " dirsep="/" property="jar.runtime.classpath" refid="jar.path">
          <map from="${lib.path}"  to="."/>
          <map from="${build.dir}" to="."/>
        </pathconvert>
        <echo message="-------------------------- ${jar.runtime.classpath}" />
      </target>
      <target name="package" depends="compile, jarpath">
        <echo message="Creating the jar file ${build.dir}/${name}.jar" />
        <tstamp>
          <format property="ts" pattern="yyyyMMdd-HHmmss-z" />
        </tstamp>
        <jar jarfile="${build.dir}/${name}.jar" basedir="${build.dest}">
          <manifest>
            <attribute name="Main-Class" value="${main.class}" />
            <attribute name="Class-Path" value="${jar.runtime.classpath}" />
            <attribute name="Implementation-Title"   value="${Name}" />
            <attribute name="Implementation-Version" value="${version}" />
            <attribute name="Implementation-Vendor"  value="${vendor}" />
            <attribute name="Build-Id" value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])" />
          </manifest>
        </jar>
      </target>