2012年8月1日水曜日

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>
外部ライブラリを置いてあるディレクトリからjarファイルの一覧を取得。
各jarファイルの絶対パスを置き換えて、半角スペース区切りの文字列にする。
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>

Assuming Ant 1.7 or above, you can use the manifestclasspath task.
<path id="dep.runtime">
<fileset dir="./lib">
<include name="**/*.jar" />
</fileset>
</path>
<property name="dep_cp" value="${toString:dep.runtime}" />

<target name="default">
<manifestclasspath property="manifest_cp" jarfile="myjar.jar">
<classpath refid="dep.runtime" />
</manifestclasspath>
<echo message="Build Classpath: ${dep_cp}" />
<echo message="Manifest Classpath: ${manifest_cp}" />
</target>

0 件のコメント:

コメントを投稿