真是,博客停更了兩個月,罪過罪過
寫這篇博客是簡介一下ant。這是一個Java的打包工具。很像是C的Makefile工具。不過是基於xml格式的,所以在語法上可能會更隨意一點,不會像是Makefile一樣困擾於嚴格縮進的問題。
ant學習起來其實很簡單,一篇博客的內容就可以了。因為知識點就那么多。不過也像是Makefile,打包一個大工程也是很不好寫的,都是要處理好依賴關系。廢話少說,下面進入正題。
一:安裝
這步,去ant.apache.org下載ant的二進制包(不要下載源碼那個包,除非你想研究)。然后就想Java一樣配置環境變量就ok了。環境變量指向bin目錄。配置好了之后,就可以使用了。打開cmd,運行ant -version。
二:建立build.xml文件
這就是一個簡單的ant文件。
保存為build.xml文件。在文件所在目錄下執行:ant命令。會看到
$ ant
Buildfile: build.xml
hello:
[echo] Hello, World
BUILD SUCCESSFUL
Total time: 2 seconds
分析:從上面的例子中,我們可以看到。build.xml簡單的有以下級別:
·project(project標簽是build文件的根元素,可以包括一個或多個target,default屬性是必須的,並且指明默認執行的target。因為ant命令無參數指定時會運行default target)
·target(這個在后面有更深入的討論,這里只要知道target的name屬性是必須的就好了)
·task(ant中的最小單元,一般就是執行一些命令了)
這個樹形關系是最基本的build文件結構。
p.s.可以通過一些命令參數做一些事。比如下面這句會指定對echo.xml執行ant,同時指定goodbye為默認的target
ant -f echo.xml goodbye
三:開始,打包你的Java程序
先簡單的對付一個文件。先寫一個hello world的Java程序吧(這里不寫,並且不要問我理由)。為了節約篇幅,這里不一步一步講了,就直接把“編譯-打包-運行”都做得一個build文件內容發上來。
basedir="."
includes="**/*.class"
/>
classpath="hello.jar"
fork="true"
/>
分析一下,很好讀懂。
1. 這個工程的默認執行是compile。這個target的task是執行javac命令(ant所支持的命令,后面的“java”也是)編譯java文件。srcdir指定要編譯的Java文件的所在位置。
2. 第二個target是jar,后面這個depend="compile"很關鍵。表明命令之間的以來關系(我們總不能不編譯就打包或者運行吧)。注意一下,在jar任務里我還指定生成manifest文件(這是Java的配置文件,不明白的一查就會懂了)
3. 最后一個是run這個target,運行就是調用java命令就可以了,指定好相應的參數。這里熟悉java命令的同學應該很容易就明白了。另外,fork="true"表示請求用一個新的JVM運行。
運行一下,這里建議用命令ant run運行這個build文件。如果你指定了default="run",就直接ant就可以了。
然后我們可以驗證一下,用這個命令java -jar hello.jar。看到了么?
四:深入,打包你的Java工程--使用ant的properties
還是先看內容:
destdir="${obj-dir}"
/>
basedir="${obj-dir}"
/>
classpath="${lib-dir}/hello.jar"
fork="true"
/>
tips:讀build文件,最好就要根據default指定的target,根據依賴關系倒序讀。
分析一下,這個文件其實可以應對很多你的Java工程的(當然,這里我們忽略只有一個hello.java的事實)。溫習一下,一個好的工程可以如下,一般都有obj、lib、src等有意義的目錄。src目錄存放源代碼,obj存放編譯好的代碼(這里是.class),lib目錄存放打包文件(生成的庫)。感覺說了這些,上面的代碼應該沒什么問題了,需要注意的是,mkdir等標簽其實調用的都是ant的命令。
執行一下ant,運行成功。當你發現你想干掉你的文件,ant clean。這就是這個build文件里的其它target了。
五:what's more?
就像是C的Makefile一樣。ant也支持一些更復雜的操作,比如條件語句。這些一般用來寫你的測試(test)任務,像上一小節的clean任務似的,這樣你的工程看起來更加健壯。
更好的使用ant來測試是使用Junit。不過這里不介紹了。
六:寫在最后
學習ant其實對我是出於無奈...hadoop的eclipse插件沒搞定,就只好用ant了...不過感覺ant比eclipse更好些。