Build.xml
 
Case one
<project> 

        <target name="clean"> 
                <delete dir="build"/> 
        </target> 

        <target name="compile"> 
                <mkdir dir="build/classes"/> 
                <javac srcdir="src" destdir="build/classes"/> 
        </target> 

        <target name="jar"> 
                <mkdir dir="build/jar"/> 
                <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"> 
                        <manifest> 
                                <attribute name="Main-Class" value="demo.HelloWorld"/> 
                        </manifest> 
                </jar> 
        </target> 

        <target name="run"> 
                <java jar="build/jar/HelloWorld.jar" fork="true"/> 
        </target> 

</project>
 
Case two
 
<project name="antdemo" basedir="." default="deploy"> 

  <!-- Project settings --> 
  <property name="project.distname" value="antdemo" /> 
  <property name="src.dir" value="src" /> 
  <property name="lib.dir" value="lib" /> 

  <!-- Local system paths --> 
  <property name="build.dir" value="build" /> 
  <property name="classes.dir" value="${build.dir}/classes" /> 
  <property name="jar.dir" value="${build.dir}/jars" /> 

  <property name="main-class" value="demo.HelloWorld" /> 

  <!-- outer jar lib --> 
  <path id="classpath"> 
    <fileset dir="${lib.dir}" includes="**/*.jar" /> 
  </path> 

  <target name="clean"> 
    <delete dir="${build.dir}" /> 
  </target> 

  <target name="compile"> 
    <mkdir dir="${classes.dir}" /> 
    <!-- In javac, we should improt the chasspathref which needed. --> 
    <javac srcdir="${src.dir}" destdir="${classes.dir}"  classpathref="classpath" />     
     <copy todir="${classes.dir}"> 
                        <fileset dir="${src.dir}" excludes="**/*.java"/> 
                </copy> 
     
  </target> 

  <!-- Create jar --> 
  <target name="jar" depends="compile"> 
    <mkdir dir="${jar.dir}" /> 
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}"> 
      <manifest> 
        <attribute name="Main-Class" value="${main-class}" /> 
      </manifest> 
    </jar> 
  </target> 

  <target name="run" depends="jar"> 
    <!-- <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>--> 
    <!-- set classpath --> 
    <java fork="true" classname="${main-class}"> 
      <classpath> 
        <path refid="classpath" /> 
        <path location="${jar.dir}/${ant.project.name}.jar" /> 
      </classpath> 
    </java> 
  </target> 

  <target name="clean-build" depends="clean,jar" /> 

  <target name="deploy" depends="clean,run" /> 


</project> 
 
Compare two cases, in front one, which just defind some single target, we should call them name clearly, each target have no relationship.
 
While in case two, it much more complex, which defined some environment variables, and defined each target relationship, and most improtant is in case two, which have use some extern libs, so in which build.xml, we should user "classpath" to describe them, and in complie target, we should set javac's classpath, if not, when you run it, it will throw some lib not found exceptions.
 
Source Code For DownLoad