最初注意到Ant是在ArcStyler这个著名的MDA工具之中,既然是MDA工具,当然要具备很多“自动”的功能。自动的从流程图到代码的生成,自动的代码编译和配置功能,自动的临时目录清理功能。而这些自动的功能中,很多来自于一个小小的“爬虫”一样的图标。这就是我后来意识到鼎鼎大名的Ant了。
现在当然知道了,从最著名商务软件开发环境JBuilder到最著名的开源IDE集成平台Eclipse上,都爬上了这只小蚂蚁的身影。而Apache组织里面几乎所有的开源项目,都是用Ant进行编译配置的。这很容易理解,Ant本身就是Apache的顶级开源项目之一。也可以说是使用得最为广泛的项目之一。
Ant的意思是“Another Neat Tool”,就是“另一个整洁的工具”。那么,第一个整洁的工具是什么呢?我想应该是make。在IDE大行其道下成长起来的程序员,也许对Ant和make都不太熟悉,但是再前一点的人们,相信都有过在机房摸着脑袋写makefile的经历了。也许你们看到这句“摸着脑袋”的话,嘴角已经露出了会心的微笑了。用make编译项目最繁琐的莫过于在不同的平台下面要写不同的makefile,即使可以写在一个makefile中,也是把真正的内容淹没在一大堆的编译开关里面。那时候,没有想到一个真正可以跨平台的编译配置工具这么快就可以出现了,那就是2000年出生的Ant。
本科的时候,最佩服一个师兄。他几乎从来不用什么开发环境和可视化的工具,搞什么事情都是make install,make clean,make –f makefile.mak,当然还有telnet,ftp等等,命令行记得纯熟无比,不管是在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最基本的内容,对于大多数人来说,已经足够了。当然,要得益于自己对xml、make、Eclipse等等相关内容都比较熟悉。
详细写学习Ant的安装、配置和学习过程没什么意思。把自己的一个小练习列在下面,就是一个上午和一个下午的学习结果:
Java项目HelloAnt,根目录名称就是HelloAnt,根目录包含build.xml和sub.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.5,JDK版本J2sdk1.4.2,Eclipse3.0.1(这个无关紧要,我在Eclipse中和在控制台运行没有丝毫区别)。
今日心情甚好,结绳以记之!