ant是项目构建工具,以xml文件作为构建文件,在这个xml文件(默认是build.xml,当然也可以取其它名字)里我们可以定义多个目标,用我们期待的方式去构建项目,比如说编译,测试,发邮件等等。

ant有一个最大的特点的就是比较随意,比如说我只想编译,那你在xml文件中只包含编译这一个目标就行,如果你只想发邮件,那么你就直接在xml文件中设置发邮件这一项即可。如果你想完成一系列的动作,当然,那也行,你设置多个目标就ok了。

当有多个目标时,我们可以定义某个目标所要依赖的目标。这样当要执行某一个目标的时候,ant会优先执行这个目标所依赖的目标。

 举例:我希望ant能以实现一系列动作:清除-编译-运行junit-生成html报告-邮件发送html报告

build.xml文件如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<project name="AntDemo" default="mail" basedir=".">

    <property name="buildnum" value="" />

    <property name="source.dir" value="src" />

    <property name="bin.dir" value="bin" />

    <property name="lib.dir" value="libs">

    </property>

    <property name="classes.dir" value="${bin.dir}" />

    <property name="report.dir" value="report${buildnum}" />

 

这一部分是指出项目的名称AntDemo;定义某些属性,方便以后调用,比如下次你要调用bin这个目录,那么你就使用${bin.dir}就ok了

 

<target name="clean">

        <delete>

            <fileset dir="${classes.dir}" includes="**/*.class" />

        </delete>

        <delete dir="${classes.dir}" />

        <mkdir dir="${classes.dir}" />

        <mkdir dir="${report.dir}" />

    </target>

这一部分是把bin目录下的文件清除,并且新建两个目录bin和report

 

<target name="compile" depends="clean">

        <!-- local project jars -->

        <patternset id="lib.includes.compile">

            <include name="*.jar" />

        </patternset>

        <fileset dir="${lib.dir}" id="lib.compile">

            <patternset refid="lib.includes.compile" />

        </fileset>

        <pathconvert targetos="windows" property="libs.compile" refid="lib.compile" />

        <!-- compile -->

        <javac srcdir="${source.dir}" destdir="${classes.dir}" classpath="${libs.compile}" includeantruntime="no" includes="**/*.java" debug="true" encoding="UTF-8">

        </javac>

    </target>

编译,依赖于clean

 

<target name="run" depends="compile">

        <junit printsummary="yes" fork="true" haltonfailure="no" showoutput="true">

            <classpath>

                <pathelement location="${classes.dir}" />

                <fileset dir="${lib.dir}" casesensitive="yes">

                    <include name="**/*.jar" />

                </fileset>

            </classpath>

            <formatter type="plain" usefile="false" />

            <formatter type="xml" />

            <sysproperty key="file.encoding" value="UTF-8" />

            <batchtest todir="${report.dir}">

                <fileset dir="${classes.dir}">

                    <include name="test/*.*" />

                    <exclude name="test/TryTest.*" />

                </fileset>

            </batchtest>

        </junit>

    </target>

 

这一部分主要是调用junit,并且生成xml格式的测试输出文件。这一部分依赖于compile。

batchtest是使用带有通配符的文件集来查找测试类,来进行批处理测试。include是要被执行的测试类,exclude是要被跳过的测试类。

 

    <target name="report" depends="run">

        <junitreport todir="${report.dir}">

            <fileset dir="${report.dir}">

                <include name="TEST-*.xml" />

            </fileset>

            <report format="noframes" todir="${report.dir}" />

        </junitreport>

        <echo message="Finished running tests." />

    </target>

<junitreport>标签使用XSTL将XML文件转换成HTML文件。

<include>设置搜寻TEST-*.xml文件,将至转换为HTML文件。

以上一段的作用就是整合report下面的Test-*.xml文件,并且生成无帧的html文件(有两种报告形式:帧frames和无帧moframes。如果报表生成帧配置,为每个类和主报告生成多个文件,将他们连接到通过链接。一个无帧报告由一个单一的文件执行测试的所有结果,无帧的方便些,建议使用). 这一部分依赖于run

 

       <target name="mail" depends="report">

              <tstamp />

              <mimemail messageMimeType="text/html" messageFile="report/junit-noframes.html" mailhost="mail.xxx.com" user="xxx.com\qa-pub" password="password" mailport="25" subject="antDemo">

                     <from address="qa-pub@xxx.com" />

                     <to address="qiuwy@xxx.com" />

              </mimemail>

       </target>

</project>

 

把report目录下的junit-noframes.html当做邮件的内容发给收件者。这一部分依赖于report。

 

html报告格式如下: