Introduction to Ant

Author: Rajesh Kumar

www.scmGalaxy.com

Agenda

  • What is ANT?
  • Installation
  • Sample build.xml
  • Executing ant script
  • Closer look at the structure of ANT file
  • Advantages of using ANT
  • Packaging - JAR, WAR, EAR

What is ANT?

  • Another Neat Tool
  • Java-based build tool
  • Like make, without make's wrinkles ?
  • An open source Apache Jakarta project
  • Implemented in Java, implemented for Java

Installation

  • Download the binaries from
  • http://jakarta.apache.org/ant/index.html
  • Unzip to a suitable directory
  • Set ANT_HOME = path_to_ant_folder
  • Append PATH=%PATH%;%ANT_HOME%\bin to the PATH environment variable
  • Append the .jar files in /path_to_ant/lib/ to the CLASSPATH environment variable
  • Ensure that JAVA_HOME points to the location of the JDK installation on your machine & /path_to_ jdk/lib/* is a part of the CLASSPATH environment variable

Working with ANT

Every project using ANT will have a build file - build.xml
<?xml version="1.0"?> 
<project name="test" default="compile" basedir="."> 
     <property name="src" value="."/> 
     <property name="build" value="build"/>
     <target name="init">  
          <mkdir dir="${build}"/>
     </target>
     
	<target name="compile" depends="init"> 
          <!-- Compile the java code -->          
          <javac srcdir="${src}" destdir="${build}"/> 
     </target>
</project>
					

A simple build.xml

<?xml version="1.0"?>
XML declaration specifying version of XML used. All XML constraints hold good for build.xml
<project name= "test" default="compile" basedir=".">
  • project - root element of build.xml
  • It has 3 attributes
    • name - name of project
    • default - (mandatory) default target when no target is specified
    • basedir - directory from which any relative directories within build.xml are referenced from

A simple build.xml [Contd.]


							<property name="src" value="."/> 
<property name="build" value="build"/>
							
  • Property declaration is like user-defined variables to use within the build file
  • It has 2 attributes
    • name - name of property
    • value - desired value of the property
  • To reference a property, ${property_name} - ${src}
  • Built in properties that ANT provides :
    • basedir
    • ant.file
    • ant.version
    • ant.project.name
    • ant.java.version

A simple build.xml [Contd.]


							<target name="init">
     <mkdir dir="${build}"/>
 </target>
							
  • target element is a wrapper for a sequence of actions
  • Has the following attributes
    • name - (mandatory) Name used to reference this target from within the file or from command line
    • description - short description of this target
    • if - to conditionally execute contents of target based on the value of a property
    • unless- converse of if

A simple build.xml [Contd.]


							<target name="compile" depends="init"> 
		<javac srcdir="${src}" destdir="${build}"/> 
  </target> 
  • depends - comma separated list of all the targets on which this target depends, i.e, targets that must be executed prior to the execution of this target
  • javac element is a task which is performed under the target compile
  • By default, only those .java input files that have a more recent timestamp than their corresponding .class output files will be compiled

Executing ant script

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

Path-like structures

- classpath

  • Wherever path-like values need to be specified, a nested element can be used :
  • <classpath>
    		<pathelement path="${classpath}"/> 	
    		<pathelement location="lib/helper.jar"/>
    	</classpath>
    	<classpath path ="${classpath}"/>
    						
    • location - specifies a single file or directory relative to the project's base directory or an absolute filename
    • path - accepts ":" or ";" separated lists of locations

Path-like structures

- path


					<path id="project.class.path">
	  <path refid="base.path"/>
    <pathelement location="lib/"/>
 </path>
 <classpath refid="project.class.path"/>
					
To use the same path-like structure for several tasks, you can define them with a <path> element at the same level as targets, and reference them via their id attribute

Path-like structures

- dirset, fileset,filelist


						 <classpath>
      <pathelement path="${classpath}"/>
      <fileset dir="lib">
        <include name="**/*.jar"/>
      </fileset>
      <pathelement location="classes"/>
      <dirset dir="${build.dir}">
        <include name="apps/**/classes"/>
        <exclude name="apps/**/*Test*"/>
      </dirset>
      <filelist dir="${src.dir}" files="foo.xml,bar.xml"/>
</classpath>		

Tasks

  • Piece of code that can be executed
  • Built-in tasks :
    • javac, java, javadoc, javah, junit
    • mkdir, copy, move, delete, fileset
    • jar, war, zip, unjar, unwar, unzip
    • echo, cvs, exec
    • ant, antcall
  • You can also write your own tasks
javac

						<javac debug="${debug}" 
        optimize="${optimize}"  
        deprecation="${deprecation}" 
        destdir="${build.dest}" 
        includes="com/**" excludes="**/*.xml">
 		<src path="${src.dir}" />   
		<classpath refid="classpath" />   
 </javac>
  • Compiles a java source tree
  • Source & destination directory recursively scanned for .java files to compile
  • By default only check made for rebuild is existence / modification time
  • To define any other java class dependencies use task <depend>

Building subprojects

- ant


					 <ant antfile="subproject/subbuild.xml"    
	    dir="subproject" 
       target="compile"/>
 <ant inheritAll="false"      
	   antfile="subproject/subbuild.xml">
    <property name="output.type" value="html"/>
</ant>	
					
  • Runs Ant on supplied build file
  • This task must not be used outside of a target if it invokes the same build file that it is part of

Calling other targets

- antcall


					 	<target name="default">
    <antcall target="doSomethingElse">
      <param name="param1" value="value"/>
    </antcall>
  </target>
  <target name="doSomethingElse">
    <echo message="param1=${param1}"/>
  </target>
					
  • Call another target within the same build-file (optionally specifying properties)
  • This task must no be used outside of a target

Advantages

  • Ease of use
    • Configuration files are XML based
    • Same config file (build.xml) can be used across platforms
  • Platform independent
  • Special support for Java
    • Easy to create JavaDocs, WAR & JAR files
  • Built-in support for
    • JUnit
    • FTP
    • CVS

Advantages [Contd.]

  • Particularly good for automating complicated repetitive tasks which is what most build processes are all about!
  • ANT can be integrated with most Java IDEs
    • Eclipse
    • Jbuilder
    • IntelliJIdea

PACKAGING

EJB Packaging

- ejb-jar
  • ejb-jar file will contain :
    • Beans' class files
    • Beans" deployment descriptors
      • META-INF/ejb-jar.xml
      • Application server specific file (e.g. META-INF/jboss.xml)
  • Sample ejb-jar.xml
  • Sample application specific descriptor file

Web ARchive (WAR)

  • Has specific hierarchical directory structure
  • Top-level directory is the document root of application
  • WAR has the following folders (usually):
    • jsp - JSP files
    • images - images used in the JSPs
    • css - style sheet files
    • scripts - javascript files
    • WEB-INF
  • WEB-INF folder contains
    • Configuration files like web.xml, struts-config.xml
    • .tld files (if any)
    • lib : directory that contains jar archives of libraries
    • classes : directory that contains the servlet classes and utility classes

Enterprise ARchive (EAR)

  • An EAR file can contain :
    • Web components (war)
    • Beans (ejb-jar)
    • Libraries (jar)
    • J2EE deployment descriptor (META-INF/application.xml)
  • Sample application.xml

References

Thank You !

Author: Rajesh Kumar

rajeshkumar.raj06@gmail.com