www.scmGalaxy.com Using Ant to build J2EE Applications Rajesh Kumar rajeshkumar.raj06@gmail.com www.scmGalaxy.com www.scmGalaxy.com Contents Introduction How does ANT work ? Sample Build file Built-in properties ANT – Different flows Writing your own task Command-line options IDE Integration References www.scmGalaxy.com www.scmGalaxy.com Introduction What Is Ant? A build tool like ‘make’ Open source – from the Apache Jakarta project – http://ant.apache.org/ Implemented in Java Used to build many open source products www.scmGalaxy.com www.scmGalaxy.com Introduction ..contd Ease of use – Ant is extended using Java classes – The configuration files are XML-based, calling out a target tree where various tasks get executed – Same config file (build.xml) can be across multiple platorms www.scmGalaxy.com www.scmGalaxy.com How does ANT Work ? Ant commands (or tasks) are implemented by Java classes – many are built-in – others come in optional JAR files – custom commands can be created Each project using Ant will have a build file – typically called build.xml since Ant looks for this by default Each build file is composed of targets – these correspond to common activities like compiling and running code Each target is composed of tasks – Each task is run by an object that implements a particular Task interface – executed in sequence when the target is executed – like make, Ant targets can have dependencies – for example, modified source files must be compiled before the application can be run www.scmGalaxy.com www.scmGalaxy.com How does ANT Work ? .. contd Targets to be executed – can be specified on the command line when invoking Ant – if none are specified then the default target is executed – execution stops if an error is encountered – so all requested targets may not be executed Each target is only executed once – regardless of the number of other targets that depend on it – for example • the “test” and “deploy” targets both depend on “compile” • the “all” target depends on “test” and “deploy” but “compile” is only executed once when “all” is executed Some tasks are only executed when they need to be – for example, files that have not changed since the last time they were compiled are not recompiled www.scmGalaxy.com www.scmGalaxy.com Sample Build file <project name=“test" default=“hello"> <target name=“hello" depends=“setup, pre-hello1, pre-hello2“> <echo> Hello World</echo> </target> <target name=“setup”> <property name=“company.name” value=“MindTree”/> <condition property="os.is.solaris"> <os name="SunOS" /> </condition> </target> <target name=“pre-hello1” if="os.is.solaris“> <echo> You are running this script in Solaris </echo> </target> <target name=“pre-hello2” unless="os.is.solaris“> <echo> You are NOT running this script in Solaris </echo> </target> </project> www.scmGalaxy.com www.scmGalaxy.com Sample Build file Save the file as test.xml in some temporary folder ( Say C:\Temp) Set ANT_HOME= C:\Jakarta-Ant-1.5 Set PATH=%PATH%;%ANT_HOME%\bin Cd C:\Temp ant –buildfile test.xml Buildfile: test.xml setup: pre-hello1: pre-hello2: [echo] You are NOT running this script in Solaris hello: [echo] Hello World BUILD SUCCESSFUL Total time: 1 second www.scmGalaxy.com www.scmGalaxy.com Built-in Properties Ant provides access to all system properties and also has some additional properties. basedir The absolute path of the project's basedir (as set with the basedir attribute of <project>). ant.file The absolute path of the buildfile. ant.version The version of Ant ant.project.na me The name of the project that is currently executing; it is set in the name attribute of <project>. ant.java.versi on the JVM version Ant detected; www.scmGalaxy.com www.scmGalaxy.com Ant – Different flows Using “depends” Using “antcall” Using “ant” www.scmGalaxy.com www.scmGalaxy.com Ant – Different flows Using “depends” – Last task to first task Eg : <target name="compile" depends="init, setup" description="compile the source " > <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}"/> </target> www.scmGalaxy.com www.scmGalaxy.com Ant – Different flows Using “antcall” – Sequential & Functional oriented Calling different targets in the same build.xml (very similar to calling functions in regular programming language) Eg : <antcall target="copymodule"> <param name="module.name" value="user"/> </antcall> <target name="copymodule" if="gws.prepared"> <echo>Module : ${module.name} </echo> <copy todir="${gws.app}/j2ee-apps/gws/${module.name}" includeEmptyDirs="no"> <fileset dir="${gws.class.folder}"> <patternset> <include name="**/${module.name}/**"/> </patternset> </fileset> </copy> </target> www.scmGalaxy.com www.scmGalaxy.com Ant – Different flows Using “ant” This is used for running scripts for subprojects Eg : <target name="ROOT"> <ant dir="${basedir}/ROOT" target="dist"/> </target> <target name="examples"> <ant dir="${basedir}/examples" target="dist"/> <ant antfile="subproject/subbuild.xml" dir=“${basedir}/subproject" target="compile"/> </target> www.scmGalaxy.com www.scmGalaxy.com Core & Optional tasks http://ant.apache.org/manual/index.html www.scmGalaxy.com www.scmGalaxy.com Writing your own task 1. 2. 3. 4. 5. 6. Create a Java class that extends org.apache.tools.ant.Task For each attribute, write a setter method. Implement the interface org.apache.tools.ant.TaskContainer if your task contains other tasks as nested elements Write a public void execute method, with no arguments, that throws a BuildException Adding your task to the system 1. Make sure the class that implements your task is in the classpath when starting Ant. 2. Add a <taskdef> element to your project. This actually adds your task to the system. 3. Use your task in the rest of the buildfile Eg: <?xml version="1.0"?> <project name="OwnTaskExample" default="main" basedir="."> <taskdef name="mytask“ classname="com.mydomain.MyVeryOwnTask"/> <target name="main"> <mytask message="Hello World! MyVeryOwnTask works!"/> </target> </project> www.scmGalaxy.com www.scmGalaxy.com Command line options ant [options] [target [target2 [target3] ...]] Options: -help print this message -projecthelp print project help information -version print the version information and exit -diagnostics print information that might be helpful to diagnose or report problems. -quiet, -q be extra quiet -verbose, -v be extra verbose -debug print debugging information -emacs produce logging information without adornments -logfile <file> use given file for log -l <file> '' -logger <classname> the class which is to perform logging -listener <classname> add an instance of class as a project listener -buildfile <file> use given buildfile -file <file> '' -f <file> '' -D<property>=<value> use value for given property -propertyfile taking precedence -inputhandler <class> the class which will handle input requests -find <file> <name> load all properties from file with -D properties search for buildfile towards the root of the filesystem and use it www.scmGalaxy.com www.scmGalaxy.com IDE Integration Ant can be integrated with the following Java IDEs – Jbuilder – IntelliJ Idea – Eclipse See the Ant User Manual for more details – in http://ant.apache.org/manual/index.html www.scmGalaxy.com www.scmGalaxy.com References Home – http://ant.apache.org/ FAQ – http://ant.apache.org/faq.html Mailing Lists http://marc.theaimsgroup.com/?l=ant-user&r=1&w=2 http://archives.apache.org/eyebrowse/SummarizeList?listId=5 Books Java Development with Ant - http://www.manning.com/hatcher/ Ant: The Definitive Guide - http://www.oreilly.com/catalog/anttdg/ Related Projects : Maven - http://jakarta.apache.org/turbine/maven/ Centipede - http://www.krysalis.org/centipede/ Tools built over Ant : AntHill - http://www.urbancode.com/projects/anthill/default.jsp CruiseControl - http://cruisecontrol.sourceforge.net/ www.scmGalaxy.com www.scmGalaxy.com www.scmGalaxy.com