Tips and Tricks for Ant on Eclipse. Make JAR file for each subsystem. 2nd Version

前回のバージョンから、ちょくらちょいと修正しました。変更点は

    1. そもそもJava VMのVersionをちゃんと指定してコンパイルしないと動きません
    2. コピペとかだるいので、ループ処理を追加しました
    3. manifestフェイルをちょっと賢くしました

build.properties

説明略。

# do not use eclipse helper GUI
app.name=${ant.project.name}

java_encoding=MS932
keeptimestamp=false
verbose=false

src.dir=./src
lib.dir=./lib
lib4batch.dir=./lib4batch
external.dir=./external
defaultroot.dir=./defaultroot
etc.dir=./build
bak.files=**/*~

build.rev=****
makejar.select=**/hoge-addons/*

build.dir=./build.ant
build.src.dir=${build.dir}/src
build.classes.dir=${build.dir}/classes
build.jar.dir=${build.dir}/jars

target.vm.version=1.6
source.vm.version=1.6
javac.nowarn=off
build.debug=on
build.debuglevel=lines,vars,source
build.memoryMaximumSize=512m

imp.vendor.name=HOGE Corporation

# Tomcat
catalina.home=C:/proactive_devtool/tomcat6.0

build.xml

    1. Java VMのVersion指定してコンパイル
      1. javac のところで、source、targetを指定してください
    2. ループ処理
      1. contrib-XXX.jarをネットで探してきて、ANTのランタイム > クラスパスに追加して下さい
      2. そうすると、foreachが使えます!
      3. scriptdefでjavascriptを定義します。サブシステム毎のフォルダ階層から、jar名を切り出します。
    3. manifestフェイルをちょっと賢く
      1. tstamp使って、ビルド実行日時をmanifestに追記します
      2. 日時以外にも色々追記しようと色気出して落とし穴にはまりました。Oracle Application Serverのコンテナ上だと起動できるのに、Tomcatの開発クラスローダを使ってるとClass Not Foundとか・・・
      3. ↓のタイトル以外を使うとTomcatさんがすねます

Implementation-Title パッケージのタイトル
Implementation-Version バージョン番号
Implementation-Vendor ベンダー企業または組織
Specification-Title 仕様のタイトル
Specification-Version バージョン番号
Specification-Vendor ベンダー企業または組織

以下、できあがりバージョン。これてにANTの自習は終了!

<?xml version="1.0" encoding="Windows-31J"?>
<project name="paradise" basedir="." default="all">
	<property file="build.properties"/>
	<tstamp><format property="build.timestamp" pattern="yyyy-MM-dd 'T'HH:mm:ss"/></tstamp>
	<scriptdef name="substring" language="javascript">
		<attribute name="text" />
		<attribute name="start" />
		<attribute name="end" />
		<attribute name="property" />
		<![CDATA[
		var text = attributes.get("text");
		var start = attributes.get("start");
		var end = attributes.get("end") || text.length();
		project.setProperty(attributes.get("property"), text.substring(start, end));
		]]>
	</scriptdef>

	<!-- Include ant-contrib-XXX.jar in Eclipse ANT Runtime classpath -->
	<taskdef name="foreach" classname="net.sf.antcontrib.logic.ForEach" />

	<!-- Execute-->
	<target name="all" depends="make-jars"/>

	<!-- Common Util: Set CLASSPATH -->
	<target name="set-classpath">
		<path id="compile.class.path">
			<!-- PAE2 JAR (1) -->
			<path><fileset dir="${lib.dir}"><include name="*.jar"/></fileset></path>
			<!-- PAE2 JAR (2) -->
			<path><fileset dir="${lib4batch.dir}"><include name="*.jar"/></fileset></path>
			<!-- Container JAR -->
			<path><fileset dir="${catalina.home}/lib"><include name="*.jar"/></fileset></path>
		</path>
	</target>

	<!-- 1. Start Message -->
	<target name="begin-message"  depends="set-classpath">
		<echo>BuildName: ${ant.project.name}</echo>
		<echo>BuildHome: ${basedir}</echo>
		<echo>BuildJVM:  ${ant.java.version}</echo>
		<echo>BuildFile: ${ant.file}</echo>
	</target>

	<!-- 2. Clean -->
	<target name="clean" depends="begin-message">
		<delete dir="${build.dir}"/>
		<delete><fileset dir="." includes="${bak.files}" defaultexcludes="no"/></delete>
		<sleep seconds="1"/>
	</target>

	<!-- 3. Make directories, copye *.java -->
	<target name="setup" depends="clean">
		<mkdir dir="${build.dir}"/>
		<mkdir dir="${build.src.dir}"/>
		<mkdir dir="${build.classes.dir}"/>
		<mkdir dir="${build.jar.dir}"/>

		<copy todir="${build.src.dir}" includeemptydirs="true" preservelastmodified="${keeptimestamp}" verbose="${verbose}">
			<fileset dir="${external.dir}" includes="**/*.java"/>
		</copy>

	</target>

	<!-- 4. ALL Compile -->
	<target name="compile" depends="setup">
		<javac destdir="${build.classes.dir}" source="${source.vm.version}" target="${target.vm.version}" fork="false" includeantruntime="false">
			<src path="${build.src.dir}"/>
			<classpath>
				<path refid="compile.class.path"/>
			</classpath>
		</javac>
	</target>

	<!-- 5. foreach make jar file -->
	<target name="make-jars" depends="compile">
		<foreach param="dir" target="make-jar">
			<path>
				<!-- Only child directories -->
				<dirset dir="${build.src.dir}">
					<include name="${makejar.select}"/>
				</dirset>
			</path>
		</foreach>
	</target>

	<!-- Common Util: javac & jar -->
	<target name="make-jar" depends="set-classpath">
		<echo>Directory: ${dir}</echo>
		<substring text="${dir}" start="42" end="49" property="jarfilename" />
		<echo>jarfile name: ${jarfilename}.jar</echo>
		<javac destdir="${dir}" source="${source.vm.version}" target="${target.vm.version}" nowarn="${javac.nowarn}" debug="${build.debug}" debuglevel="${build.debuglevel}" fork="false" includeantruntime="false">
			<src path="${dir}"/>
			<classpath>
				<path refid="compile.class.path"/>
				<pathelement path="${build.classes.dir}"/>
			</classpath>
		</javac>

		<jar jarfile="${build.jar.dir}/${jarfilename}.jar">
			<fileset dir="${dir}">
				<exclude name="**/*.properties" />
				<exclude name="**/*.xml" />
			</fileset>
			<manifest>
				<attribute name="Implementation-Title" value="${jarfilename}"/>
				<attribute name="Implementation-Vendor" value="${imp.vendor.name}"/>
				<attribute name="Implementation-Version" value="${build.timestamp} [${build.rev}]"/>
			</manifest>
		</jar>

	</target>

</project>