How do I package and use a customized task?
Author: Deron Eriksson
Description: This Ant tutorial shows how to package a custom Ant task into a jar file and reference that in a build.xml file
Tutorial created using: Windows XP || JDK 1.5.0_09 || Eclipse Web Tools Platform 1.5.1


Page: < 1 2 3

(Continued from page 2)

Just in case you want it, the teamcakes-ant-util-1.0.jar file with the Variable class is included below.

teamcakes-ant-util-1.0.jar

 

The ant-utilities build-main.xml file with our new taskdef and 'variable-test' target is shown below:

ant-utilities build-main.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-utilities" default="war" basedir=".">
	<property file="build-main.properties" />

	<property name="war-file-name" value="${project-name}.war" />
	<property name="source-directory" value="src" />
	<property name="classes-directory" value="bin" />
	<property name="web-directory" value="web" />
	<property name="web-xml-file" value="web/WEB-INF/web.xml" />
	<tstamp prefix="build-info">
		<format property="current-date" pattern="d-MMMM-yyyy" locale="en" />
		<format property="current-time" pattern="hh:mm:ss a z" locale="en" />
		<format property="year-month-day" pattern="yyyy-MM-dd" locale="en" />
	</tstamp>
	<property name="build-directory" value="build" />

	<property name="ftp-remotedir" value="uploaded-wars" />

	<path id="project-classpath">
		<fileset dir="web/WEB-INF/lib" includes="*.jar" />
		<fileset dir="${tomcat-home}/bin" includes="*.jar" />
		<fileset dir="${tomcat-home}/common/lib" includes="*.jar" />
		<fileset dir="${tomcat-home}/server/lib" includes="*.jar" />
	</path>

	<path id="jar-project-classpath">
		<fileset dir="lib" includes="*.jar" />
		<fileset dir="${tomcat-home}/bin" includes="*.jar" />
		<fileset dir="${tomcat-home}/common/lib" includes="*.jar" />
		<fileset dir="${tomcat-home}/server/lib" includes="*.jar" />
	</path>

	<taskdef name="start" classname="org.apache.catalina.ant.StartTask" />
	<taskdef name="stop" classname="org.apache.catalina.ant.StopTask" />
	<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask" />
	<taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask" />
	<taskdef name="var" classname="com.cakes.ant.Variable" />

	<target name="variable-test">
		<var name="myVar" value="value1" />
		<echo>myVar is ${myVar}</echo>
		<var name="myVar" value="value2" />
		<echo>myVar is ${myVar}</echo>
	</target>

	<target name="project-name-test">
		<echo>hello, the project is: ${project-name}</echo>
	</target>

	<target name="stop" description="stop application in tomcat">
		<stop url="${tomcat-manager-url}" username="${tomcat-manager-username}" password="${tomcat-manager-password}" path="/${project-name}" />
	</target>

	<target name="start" description="start application in tomcat">
		<start url="${tomcat-manager-url}" username="${tomcat-manager-username}" password="${tomcat-manager-password}" path="/${project-name}" />
	</target>

	<target name="undeploy" description="undeploy from tomcat">
		<undeploy failonerror="no" url="${tomcat-manager-url}" username="${tomcat-manager-username}" password="${tomcat-manager-password}" path="/${project-name}" />
	</target>

	<target name="deploy" description="deploy to tomcat">
		<echo>deploying from client</echo>
		<deploy url="${tomcat-manager-url}" username="${tomcat-manager-username}" password="${tomcat-manager-password}" path="/${project-name}" war="file:/projects/workspace/${project-name}/${build-directory}/${war-file-name}" />
	</target>

	<target name="deploy-from-server">
		<echo>deploying server war file</echo>
		<sleep seconds="5" />
		<deploy url="${tomcat-manager-url}" username="${tomcat-manager-username}" password="${tomcat-manager-password}" path="/${project-name}" localwar="file:/${server-home-directory}/uploaded-wars/${war-file-name}" />
		<echo>done deploying</echo>
	</target>

	<target name="war">
		<mkdir dir="${build-directory}" />
		<delete file="${build-directory}/${war-file-name}" />
		<war warfile="${build-directory}/${war-file-name}" webxml="${web-xml-file}">
			<classes dir="${classes-directory}" />
			<fileset dir="${web-directory}">
				<!-- Need to exclude it since webxml is an attribute of the war tag above -->
				<exclude name="WEB-INF/web.xml" />
			</fileset>
			<manifest>
				<attribute name="Built-By" value="${builder}" />
				<attribute name="Built-On" value="${build-info.current-date}" />
				<attribute name="Built-At" value="${build-info.current-time}" />
			</manifest>
		</war>
	</target>

	<target name="ftp" depends="" description="upload war file to server">
		<ftp server="${ftp-server}" remotedir="${ftp-remotedir}" userid="${ftp-userid}" password="${ftp-password}" action="mkdir" verbose="yes">
		</ftp>
		<ftp server="${ftp-server}" remotedir="${ftp-remotedir}" userid="${ftp-userid}" password="${ftp-password}" action="send" verbose="yes" depends="yes">
			<fileset file="${build-directory}/${war-file-name}" />
		</ftp>
	</target>

	<target name="pscp" depends="" description="securely upload war file to server">
		<echo message="uploading war file to server using pscp" />
		<exec executable="pscp.exe">
			<arg value="-v" />
			<arg value="-pw" />
			<arg value="${ftp-password}" />
			<arg value="${build-directory}/${war-file-name}" />
			<arg value="${ftp-userid}@${ftp-server}:${ftp-remotedir}/${war-file-name}" />
		</exec>
		<echo message="done uploading war file to server using pscp" />
	</target>

	<target name="mail-build-and-deploy">
		<mail from="${email-from}" tolist="${email-to}" subject="${war-file-name} was uploaded to the server and deployed" message="The ${war-file-name} file was uploaded to ${ftp-server}
in ${ftp-remotedir} and deployed to the /${project-name} context" />
	</target>

	<target name="clean">
		<delete dir="bin" />
		<mkdir dir="bin" />
	</target>

	<target name="copy-non-java-files">
		<copy todir="bin" includeemptydirs="false">
			<fileset dir="src" excludes="**/*.java" />
		</copy>
	</target>

	<target name="compile" depends="clean,copy-non-java-files">
		<javac srcdir="src" destdir="bin" classpathref="project-classpath" />
	</target>

	<target name="compile-jar-classes" depends="clean,copy-non-java-files">
		<javac srcdir="src" destdir="bin" classpathref="jar-project-classpath" />
	</target>

	<target name="clean-jar">
		<delete dir="build" />
		<mkdir dir="build" />
	</target>

	<target name="jar">
		<jar basedir="bin" destfile="build/${project-name}.jar">
			<manifest>
				<attribute name="Built-By" value="${builder}" />
				<attribute name="Built-On" value="${build-info.current-date}" />
				<attribute name="Built-At" value="${build-info.current-time}" />
			</manifest>
		</jar>
	</target>

	<target name="build-jar">
		<antcall target="compile-jar-classes" />
		<antcall target="clean-jar" />
		<antcall target="jar" />
	</target>

	<target name="jar-version">
		<buildnumber />
		<property name="version-number" value="${major-version-number}.${build.number}" />
		<jar basedir="bin" destfile="build-version/${project-name}-${version-number}.jar">
			<manifest>
				<attribute name="Built-By" value="${builder}" />
				<attribute name="Built-On" value="${build-info.current-date}" />
				<attribute name="Built-At" value="${build-info.current-time}" />
				<attribute name="Implementation-Version" value="${version-number}" />
			</manifest>
		</jar>
	</target>

	<target name="build-jar-version">
		<antcall target="compile-jar-classes" />
		<mkdir dir="build-version" />
		<antcall target="jar-version" />
	</target>

	<target name="build-and-deploy-from-server" depends="war,ftp,undeploy,deploy-from-server,mail-build-and-deploy" />
	<target name="build-and-deploy-from-server (secure)" depends="war,pscp,undeploy,deploy-from-server,mail-build-and-deploy" />
	<target name="kitchen-sink" depends="compile,war,pscp,undeploy,deploy-from-server,mail-build-and-deploy" />
</project>
Page: < 1 2 3