最初注意到Ant是在ArcStyler这个著名的MDA工具之中,既然是MDA工具,当然要具备很多“自动”的功能。自动的从流程图到代码的生成,自动的代码编译和配置功能,自动的临时目录清理功能。而这些自动的功能中,很多来自于一个小小的“爬虫”一样的图标。这就是我后来意识到鼎鼎大名的Ant了。

现在当然知道了,从最著名商务软件开发环境JBuilder到最著名的开源IDE集成平台Eclipse上,都爬上了这只小蚂蚁的身影。而Apache组织里面几乎所有的开源项目,都是用Ant进行编译配置的。这很容易理解,Ant本身就是Apache的顶级开源项目之一。也可以说是使用得最为广泛的项目之一。

Ant的意思是“Another Neat Tool”,就是“另一个整洁的工具”。那么,第一个整洁的工具是什么呢?我想应该是make。在IDE大行其道下成长起来的程序员,也许对Antmake都不太熟悉,但是再前一点的人们,相信都有过在机房摸着脑袋写makefile的经历了。也许你们看到这句“摸着脑袋”的话,嘴角已经露出了会心的微笑了。用make编译项目最繁琐的莫过于在不同的平台下面要写不同的makefile,即使可以写在一个makefile中,也是把真正的内容淹没在一大堆的编译开关里面。那时候,没有想到一个真正可以跨平台的编译配置工具这么快就可以出现了,那就是2000年出生的Ant

本科的时候,最佩服一个师兄。他几乎从来不用什么开发环境和可视化的工具,搞什么事情都是make installmake cleanmake –f makefile.mak,当然还有telnetftp等等,命令行记得纯熟无比,不管是在windows还是linux下面。写程序的时候当然更是如此,一堆一堆的目录,源程序,通通一个都是一个make来管理。用VC的时候是nmake,用gcc的时候就是make。现在想起来,他就是把一个make用得滚瓜烂熟了,不想再用其他东西而已。

很早就明白了,离开IDE就不会编译程序的程序员,永远不可能成为真正的程序员。但是一直以来,不想好好学习make或者ant,每次事到临头都是匆匆修改别人的makefile或者build.xml,抱抱佛脚,里面的内容也是似是而非,似懂非懂。但是,我觉得Ant还是最终要学的一门手艺,特别是对于一个java程序员。

今天终于下定决心,要认真看看Ant,事情的起因是因为hibernate的学习过程中,看到一个例子程序使用了Ant,不甚了了,所以下了决心。运气特别好的是,Ant有一个非常好的入门教程http://www.javafan.net/softview.jsp?ID=206。用了一个上午加上一个下午的时间,基本上已经掌握了Ant最基本的内容,对于大多数人来说,已经足够了。当然,要得益于自己对xmlmakeEclipse等等相关内容都比较熟悉。

详细写学习Ant的安装、配置和学习过程没什么意思。把自己的一个小练习列在下面,就是一个上午和一个下午的学习结果:

Java项目HelloAnt,根目录名称就是HelloAnt,根目录包含build.xmlsub.xml

项目包含一个src子目录,src中包含一个源文件HelloAnt.java

文件内容如下:

HelloAnt

public class HelloAnt {

 

       public static void main(String[] args) {

              System.out.println("Hello Ant!");

       }

}

 

build.xml

<?xml version="1.0"?>

<project default="jar" name="Project HelloAnt">

    <description>

 

</description>

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

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

    <property name="build.dir" value="classes"/>

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

    <property name="user.name" value="Wxb_nudt"/>

    <path id="myclasspath">

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

    </path>

 

    <target name="init" description="初始化编译工作">

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

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

        <tstamp/>

    </target>

 

    <target name="build" depends="init" description="编译源文件">

        <javac srcdir="${src.dir}" destdir="${build.dir}"/>

        <copy todir="${build.dir}">

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

                <exclude name="**/*.java"/>

            </fileset>

        </copy>

    </target>

   

    <target name="jar" depends="build" description="打包class文件和源代码">

        <jar destfile="${dist.dir}/HelloAnt-${DSTAMP}.jar" basedir="${build.dir}">

        <manifest>

        <attribute name="Built-By" value="${user.name}"/>

        </manifest>

        </jar>

        <jar destfile="${dist.dir}/HelloAnt-src-${DSTAMP}.jar" basedir="${src.dir}"/>      

    </target>

   

    <target name="run" depends="build" description="运行HelloAnt的main函数">

        <java classpathref="myclasspath" classname="HelloAnt" fork="true"/>

    </target>

 

    <target name="clean" description="清除编译过程中创建的目录">

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

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

    </target>

   

    <target name="copy" description="将源文件夹中的java文件拷贝到build文件夹">

        <copy todir="${build.dir}">

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

                <include name="*.java"/>

            </fileset>

        </copy>

        <echo message="copy file finished!"/>

    </target>

   

    <target name="CallSub" description="调用另一个sub.xml文件中的目标">

        <ant antfile="sub.xml" target="showMessage" inheritAll="false">

            <property name="message" value="Hello from parent build"/>

        </ant>

    </target>

 

</project>

 

sub.xml

<?xml version="1.0"?>

<project default="showMessage">

<target name="showMessage">

<echo message="Message=${message}"/>

</target>

</project>

 

运行结果如下:

输入ant

Buildfile: D:\eclipse301\workspace\HelloAnt\build.xml

init:

    [mkdir] Created dir: D:\eclipse301\workspace\HelloAnt\classes

    [mkdir] Created dir: D:\eclipse301\workspace\HelloAnt\dist

build:

    [javac] Compiling 1 source file to D:\eclipse301\workspace\HelloAnt\classes

jar:

      [jar] Building jar: D:\eclipse301\workspace\HelloAnt\dist\HelloAnt-20050518.jar

      [jar] Building jar: D:\eclipse301\workspace\HelloAnt\dist\HelloAnt-src-20050518.jar

BUILD SUCCESSFUL

Total time: 3 seconds

输入ant run

Buildfile: D:\eclipse301\workspace\HelloAnt\build.xml

init:

build:

run:

     [java] Hello Ant!

BUILD SUCCESSFUL

Total time: 2 seconds

输入ant copy

Buildfile: D:\eclipse301\workspace\HelloAnt\build.xml

copy:

     [copy] Copying 1 file to D:\eclipse301\workspace\HelloAnt\classes

     [echo] copy file finished!

BUILD SUCCESSFUL

Total time: 1 second

输入ant CallSub

Buildfile: D:\eclipse301\workspace\HelloAnt\build.xml

CallSub:

showMessage:

     [echo] Message=Hello from parent build

BUILD SUCCESSFUL

Total time: 922 milliseconds

输入ant clean

Buildfile: D:\eclipse301\workspace\HelloAnt\build.xml

clean:

   [delete] Deleting directory D:\eclipse301\workspace\HelloAnt\classes

   [delete] Deleting directory D:\eclipse301\workspace\HelloAnt\dist

BUILD SUCCESSFUL

Total time: 985 milliseconds

其中Ant版本1.5JDK版本J2sdk1.4.2Eclipse3.0.1(这个无关紧要,我在Eclipse中和在控制台运行没有丝毫区别)。

今日心情甚好,结绳以记之!