Ant-最終還是要學(xué)的一門手藝
最初注意到Ant是在ArcStyler這個(gè)著名的MDA工具之中,既然是MDA工具,當(dāng)然要具備很多“自動(dòng)”的功能。自動(dòng)的從流程圖到代碼的生成,自動(dòng)的代碼編譯和配置功能,自動(dòng)的臨時(shí)目錄清理功能。而這些自動(dòng)的功能中,很多來自于一個(gè)小小的“爬蟲”一樣的圖標(biāo)。這就是我后來意識到鼎鼎大名的Ant了。
現(xiàn)在當(dāng)然知道了,從最著名商務(wù)軟件開發(fā)環(huán)境JBuilder到最著名的開源IDE集成平臺Eclipse上,都爬上了這只小螞蟻的身影。而Apache組織里面幾乎所有的開源項(xiàng)目,都是用Ant進(jìn)行編譯配置的。這很容易理解,Ant本身就是Apache的頂級開源項(xiàng)目之一。也可以說是使用得最為廣泛的項(xiàng)目之一。
Ant的意思是“Another Neat Tool”,就是“另一個(gè)整潔的工具”。那么,第一個(gè)整潔的工具是什么呢?我想應(yīng)該是make。在IDE大行其道下成長起來的程序員,也許對Ant和make都不太熟悉,但是再前一點(diǎn)的人們,相信都有過在機(jī)房摸著腦袋寫makefile的經(jīng)歷了。也許你們看到這句“摸著腦袋”的話,嘴角已經(jīng)露出了會(huì)心的微笑了。用make編譯項(xiàng)目最繁瑣的莫過于在不同的平臺下面要寫不同的makefile,即使可以寫在一個(gè)makefile中,也是把真正的內(nèi)容淹沒在一大堆的編譯開關(guān)里面。那時(shí)候,沒有想到一個(gè)真正可以跨平臺的編譯配置工具這么快就可以出現(xiàn)了,那就是2000年出生的Ant。
本科的時(shí)候,最佩服一個(gè)師兄。他幾乎從來不用什么開發(fā)環(huán)境和可視化的工具,搞什么事情都是make install,make clean,make –f makefile.mak,當(dāng)然還有telnet,ftp等等,命令行記得純熟無比,不管是在windows還是linux下面。寫程序的時(shí)候當(dāng)然更是如此,一堆一堆的目錄,源程序,通通一個(gè)都是一個(gè)make來管理。用VC的時(shí)候是nmake,用gcc的時(shí)候就是make。現(xiàn)在想起來,他就是把一個(gè)make用得滾瓜爛熟了,不想再用其他東西而已。
很早就明白了,離開IDE就不會(huì)編譯程序的程序員,永遠(yuǎn)不可能成為真正的程序員。但是一直以來,不想好好學(xué)習(xí)make或者ant,每次事到臨頭都是匆匆修改別人的makefile或者build.xml,抱抱佛腳,里面的內(nèi)容也是似是而非,似懂非懂。但是,我覺得Ant還是最終要學(xué)的一門手藝,特別是對于一個(gè)java程序員。
今天終于下定決心,要認(rèn)真看看Ant,事情的起因是因?yàn)?/SPAN>hibernate的學(xué)習(xí)過程中,看到一個(gè)例子程序使用了Ant,不甚了了,所以下了決心。運(yùn)氣特別好的是,Ant有一個(gè)非常好的入門教程http://www.javafan.net/softview.jsp?ID=206。用了一個(gè)上午加上一個(gè)下午的時(shí)間,基本上已經(jīng)掌握了Ant最基本的內(nèi)容,對于大多數(shù)人來說,已經(jīng)足夠了。當(dāng)然,要得益于自己對xml、make、Eclipse等等相關(guān)內(nèi)容都比較熟悉。
詳細(xì)寫學(xué)習(xí)Ant的安裝、配置和學(xué)習(xí)過程沒什么意思。把自己的一個(gè)小練習(xí)列在下面,就是一個(gè)上午和一個(gè)下午的學(xué)習(xí)結(jié)果:
Java項(xiàng)目HelloAnt,根目錄名稱就是HelloAnt,根目錄包含build.xml和sub.xml。
項(xiàng)目包含一個(gè)src子目錄,src中包含一個(gè)源文件HelloAnt.java。
文件內(nèi)容如下:
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="打包c(diǎn)lass文件和源代碼">
<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="運(yùn)行HelloAnt的main函數(shù)">
<java classpathref="myclasspath" classname="HelloAnt" fork="true"/>
</target>
<target name="clean" description="清除編譯過程中創(chuàng)建的目錄">
<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="調(diào)用另一個(gè)sub.xml文件中的目標(biāo)">
<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>
運(yùn)行結(jié)果如下:
輸入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(這個(gè)無關(guān)緊要,我在Eclipse中和在控制臺運(yùn)行沒有絲毫區(qū)別)。
今日心情甚好,結(jié)繩以記之!