Apache Ant简介

简单的讲,Ant是一个命令行工具,可以用来编译java文件,执行java程序,生成jar文件,执行测试等。

具体参见http://ant.apache.org/

1.Ant的配置

(1)下载Ant

http://ant.apache.org/bindownload.cgi

下载解压后放在某路径下,例如:C:\apache-ant-1.8.2

(2)配置环境变量

追加系统环境变量:“ANT_HOME”,值:“C:\apache-ant-1.8.2”

在系统环境变量“Path”里追加“C:\apache-ant-1.8.2\bin”

(3)验证配置是否正确

在命令行输入“ant -version”

如果显示“Apache Ant(TM) version 1.8.2 compiled on December 20 2010”,说明正确

2.创建build.xml文件

用XML编写,至少包含一个project和一个target.

以下面这个build.xml为例说明

主要任务:

(1)正式source文件(src目录下)和Junit测试(test目录下)文件可以分别编译。

(2)生成jar文件,并且不包含测试文件。

(3)通过ant执行Junit测试,生成测试报告。

编写思路:

(1)根据上述任务,至少需要编写4个target

 target1:compile,编译正式source文件

 target2:testcomplile,编译test文件

 target3:make-jar,生成jar文件

 target4:runtests,执行junit测试

(2)辅助target

 target5:JUNIT,执行Junit测试需要此target支持

 target6:apidocs,生成javaDoc

 target7:rmi-compile,编译RMI相关文件(工程中涉及到了RMI通信内容)。

特别说明:test目录下的测试文件与src的source文件是一一对应的,包结构完全一致。

主要目录结构

myproject
├─bin
├─config
├─image
├─lib
├─log
├─src
│  └─AAA
│      └─BBB
│          └─CCC
└─test
    └─AAA
        └─BBB
            └─CCC
               

----------------------------------------file start-------------------------------------------

<?xml version="1.0" encoding="Shift_JIS"?>

<!-- project tag
 name   :工程名字
 default:默认执行的target
 basedir:ant执行的根目录-->
<project name="myproject" default="runtests" basedir=".">
 <!-- source路径 -->
 <property name="src.dir" value="src" />

 <!-- 编译后class路径 -->
 <property name="build.dir" value="classes" />

 <!-- JavaDoc路径 -->
 <property name="build.apidocs" value="${build.dir}/doc" />

 <!-- 测试source路径
  test.dir   : JUnit执行路径
 -->
 <property name="testSrc.dir" value="test" />

 <!-- test报告路径 -->
 <property name="reports.dir" value="./doc/report" />

 <!-- test结果统计路径 -->
 <property name="correctreports.dir" value="${reports.dir}/html" />

 <!-- target tag
  name         :target名字
  depends    :依赖target,先执行被依赖的target.
  description:target描述
 -->
 <target name="JUNIT">
     <available property="junit.present" classname="junit.framework.TestCase" />
 </target>
 
 <target name="compile" depends="JUNIT">
     <mkdir dir="${build.dir}"/>
  <depend srcdir="${src.dir}" destdir="${build.classes}"/>
  <javac srcdir="${src.dir}" destdir="${build.classes}">
   <classpath>
    <pathelement path="${build.classes}"/>
    <pathelement path="${java.class.path}/"/>
   </classpath>
   <include name="**/*.java"/>
  </javac>
 </target>


 <target name="testcompile" depends="compile">
  <depend srcdir="${testSrc.dir}" destdir="${build.classes}"/>

<!-- test class文件与正式class文件,输出到同一目录下

也就是说正式source和测试source的原文件(java文件)不同目录,但编译后的class文件同目录。

-->
  <javac srcdir="${testSrc.dir}" destdir="${build.classes}" fork="true" memoryMaximumSize="512m">
   <compilerarg value="-Xlint:unchecked"/>
   <classpath>
    <pathelement path="${build.classes}"/>
    <pathelement path="${java.class.path}/"/>
    <fileset dir="lib">
     <include name="*.jar"/>
    </fileset>
   </classpath>
   <include name="**/*.java"/>
  </javac>
 </target>


 <target name="rmi-compile" depends="compile">
  <rmic base="${build.classes}" verify="true">
   <classpath>
    <pathelement path="${build.classes}"/>
    <pathelement path="${java.class.path}/"/>
   </classpath>
   <include name="**/*.class"/>
   <exclude name="**/test/*.class"/>
  </rmic>
 </target>
 
 <target name="runtests" depends="testcompile">
  <delete>
   <fileset dir="${reports.dir}" includes="**/*" />
  </delete>
  <mkdir dir="${reports.dir}"/>

  <junit printsummary="on" failureProperty="fail">
   <classpath>
    <pathelement location="lib/***.jar" />
    <pathelement location="lib/***.jar" />
    <pathelement path="${build.classes}"/>
    <pathelement path="${java.class.path}/"/>
   </classpath>
   
   <formatter type="xml"/>

   <batchtest fork="yes" todir="${reports.dir}">
    <fileset dir="${src.dir}">
     <!-- 只执行test CLASS -->
     <include name="${test.dir}**/*Test.java" />
    </fileset>
   </batchtest>
  </junit>

  <junitreport todir="${reports.dir}">
   <fileset dir="${reports.dir}">
    <include name="TEST-*.xml"/>
   </fileset>

   <report format="frames" todir="${correctreports.dir}"/>
  </junitreport>
 </target>
 
 <!-- JavaDoc生成 -->
 <target name="apidocs" depends="compile" description="JavaDoc生成">
  <javadoc sourcepath="${src.dir}" destdir="${build.apidocs}"
   packagenames="AAA.BBB.CCC.*"
   author="true"
   version="true"
   notree="true"
   nonavbar="true"
   noindex="true"
   windowtitle="MyProject API"
   doctitle="Regulation"
   public="true"
  />
 </target>

 <!-- Jar生成 -->
 <target name="make-jar" depends="rmi-compile" description="Jar生成">
  <delete file="myproject.jar"/>
  <jar jarfile="myproject.jar" manifest="MANIFEST.MF">
   <fileset dir="classes">

<!--除去test文件-->
    <exclude name="**/test/"/>
   </fileset>
  </jar>
 </target>
</project>

--------------------------------------file end----------------------------------------------

3.执行build.xml

将build.xml放到myproject工程的根目录下。

控制台切换到myproject工程的根目录“C:\myproject”:

(1)编译正式source

C:\myproject>ant compile

(2)编译测试文件

C:\myproject>ant testcompile

(3)生成jar文件,并且不包含测试文件。

C:\myproject>ant make-jar

(4)通过ant执行Junit测试,生成测试报告。

C:\myproject>ant runtest