概要

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以下にある、properties.xmlファイルを編集して環境に合わせて修正してください。

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <property name="main.class"        value="example.MainPanel" />
  <property name="runtime.classpath" value=". jlfgr-1_0.jar lib/test.jar" />
  <!-- 中略 -->
</project>

以下のように、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 ファイルの仕様)、細かい制限があるようです。

コメント

  • 参照するjarファイルが多い場合は、pathconvertタスクを使ってマニフェストのクラスパスを自動生成するのが楽です --
    • たしかに数が多いと大変そうですね。上記のpackageターゲットを修正して、pathconvertタスクを使うサンプルを以下においてみました*1。 -- aterai
<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>