Antでjarファイルを作るときにmanifestファイルをClass-Pathごと自動生成する方法

大体以下のようになる。

<jar jarfile="${生成するjarファイルの名前}" basedir="${classファイルのあるディレクトリ}">
    <path id="libraries">
        <fileset dir="${外部ライブラリ用ディレクトリ}" includes="*.jar"/>
    </path>
    <pathconvert property="classpath" refid="libraries" targetos="unix" pathsep=" ">
        <map from="${basedir}\${外部ライブラリ用ディレクトリ}\"
             to="${実行時のjarファイルから外部ライブラリへのパス}"/>
        <map from="\" to="/"/>
    </pathconvert>
    <manifest>
        <attribute name="Main-Class" value="${メインクラス}"/>
        <attribute name="Class-Path" value="${classpath}"/>
    </manifest>
</jar>
  1. 外部ライブラリを置いてあるディレクトリからjarファイルの一覧を取得。
  2. 各jarファイルの絶対パスを置き換えて、半角スペース区切りの文字列にする。
  3. manifestファイルにメインクラスと一緒に指定。

という感じ。

以下にEclipseで使っているAnt用build.xmlのテンプレートを載せておく。

<?xml version="1.0" encoding="UTF-8"?>
<project name="build" default="build"  basedir=".">
    <!-- 生成するjarファイル名(拡張子を含まない) -->
    <property name="jar.name" value=""/>
    <!-- 実行するメインクラス名(パッケージ名を含む) -->
    <property name="main" value=""/>
    <!-- 生成されたjarファイルの配置先 -->
    <target name="deploy" depends="jar">
        <copy file="${jar.filepath}" todir=""/>
    </target>
    <!-- jarファイルの配置先でライブラリを置くパス -->
    <property name="dst.lib.dir" value="../lib/java/"/>

    <!-- ソースファイルを置くディレクトリ -->
    <property name="src.dir" value="src"/>
    <!-- 外部ライブラリを置くディレクトリ -->
    <property name="lib.dir" value="lib"/>
    <!-- クラスファイルを置くディレクトリ -->
    <property name="classes.dir" value="bin"/>
    <!-- javadocを出力するディレクトリ -->
    <property name="javadoc.dir" value="docs"/>
    <!-- 生成されたjarファイルを置くパス -->
    <property name="jar.filepath" value="${lib.dir}/${jar.name}.jar"/>

    <!-- デフォルトターゲット -->
    <target name="build">
        <antcall target="javadoc"/>
        <antcall target="deploy"/>
        <delete file="${jar.filepath}"/>
    </target>
    <!-- jarファイルの生成 -->
    <target name="jar" depends="compile">
        <!-- ライブラリパスを生成 -->
        <path id="libraries">
            <fileset dir="${lib.dir}" includes="*.jar"/>
        </path>
        <pathconvert property="classpath" refid="libraries" targetos="unix" pathsep=" ">
            <map from="${basedir}\${lib.dir}\" to="${dst.lib.dir}"/>
            <map from="\" to="/"/>
        </pathconvert>
        <jar jarfile="${jar.filepath}" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main}"/>
                <attribute name="Class-Path" value="${classpath}"/>
            </manifest>
        </jar>
    </target>
    <!-- コンパイル -->
    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
    </target>
    <!-- Javadocの生成-->
    <target name="javadoc">
        <javadoc sourcepath="${src.dir}" extdirs="${lib.dir}" destdir="${javadoc.dir}"
                 encoding="UTF-8" additionalparam="-J-Dfile.encoding=UTF-8"/>
    </target>
</project>