說到Ant,是有一點過時了,現在maven已經被廣泛使用。
但是作為一個老牌的build工具,Ant在現存項目中仍然被廣泛使用著。所以學習它也是在所難免的。
官方使用手冊:
http://ant.apache.org/manual/
一個不錯的學習ant的網站。我的這篇文章不是ant入門,所以強烈建議沒入門的同學從這個網站開始:
http://www.exubero.com/ant/antintro-s5.html
1,Ant是Apache的開源項目
2,Ant的表現形式是XML格式的Ant script,裡面由一系列順序執行的“command”組成。所有Ant有一套自己的文法,但是非常簡單直接。
3,Ant是用java編寫的。它本質上就是一個java程式,將XML格式的Ant script解釋成實際的java程式後,運行。
有時Ant運行出錯時,可以看到低層程式拋出的java異常。
Ant script是XML的格式。它的組成要素是:
project
target -- a tartget is a set of tasks you want to execute. you also can select which targets you want to execute when starting Ant
task
property--property是immutable的。可以把property理解成string constant,字元常量,而不是變數。一旦定義好這個字元變數後,就可以在後面的task中使用了。
Ant已經定義好了一系列的build-in properties可以直接使用。
1,例如${os.name}, 其實就是java中提供的getProperties方法提供的變數。
2,此外Ant還額外提供了一些properties。
<property file="..\project.properties" /> 我們會經常需要從一個設定檔load一系列的properties進來。
<property environment="env"/> 也會經常需要使用環境變數。
當我們在使用cruisecontrol或jenkins調用ant時,也許在ant指令碼裡需要使用一些環境變數,例如JENKINS_HOME。
Jenkins會將一些類似JENKINS_HOME設定為環境變數,然後ant中就可以用上句接收這些環境變數了。
path--這個在後面解釋
Ant指令碼是XML的形式,可以方便的 用文字編輯器編輯。因此Ant沒有專門的編輯工具或IDE。
Notepad++就是一個不錯的編輯工具,結合它自身的全文檢索搜尋功能,高亮關鍵字功能等,可以在理解邏輯關係,編寫指令碼時省去不少麻煩。
但是在編輯複雜Ant指令碼時仍然會遇到很多問題:
1,有時邏輯上的跳轉太厲害,看一會兒就暈了。
2,無法debug。
ant執行出錯時,會返回出錯的程式碼數,而且很準確。同時有時也會拋出低層的java異常。
因此根據ant log判斷問題所在並不是很困難。
但是不能debug,仍然會經常導致難以判斷問題所在。例如雖然看起來是某行代碼出錯,但實際上是另外代碼引起的。此類問題完全只能靠經驗和閱讀ant log判斷。
3,在閱讀ant指令碼時,當遇到非core task時,常常不知道是哪個外掛程式的功能。
例如在ant中看到shellscript task,這不是一個ant提供的標準功能,也無法直接得知這是哪個第三方工具提供的功能。
但是絕大多數IDE都整合了ant。例如在eclipse中運行,debug ant script非常方便:
1,在eclipse中open file->選擇開啟一個build.xml。
2,此時eclipse的outline會顯示出ant script的結構。
3,右擊其中任何一個結構體,例如target,就可以看到run as ant build或debug as ant build了。點擊即可運行。
要運行Ant非常簡單,直接在命令列裡運行即可。
ant [options] [target-names]
例如:ant run targetname
在外掛程式方面,ant無法和maven相比。但ant仍然有一些第三方工具被大量使用。
查看有哪些外掛程式:
http://ant.apache.org/external.html#IDE%20and%20Editor%20Integration
大家知道ant有很多core-task,而外掛程式則提供了更多了tasks,可在Ant script中使用。
1,首先需要把第三方類庫的jar檔案都copy到一個目錄下。如/lib
2,其次在Ant script中加入以下語句。此時path的作用就很清楚了,其實就是告訴ant應該去哪裡找jar檔案。和classpath的作用一樣。
<property name="lib.dir" value="lib"/>
<path id="project.classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
3,最後定義要使用的第三方類庫,注意classpathref的值就是我們剛剛定義的path id。
<taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="project.classpath"/>
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpathref="project.classpath"/>
<taskdef uri="jwaresoftware.antxtras" resource="org/jwaresoftware/antxtras/install/antlib.xml" classpathref="project.classpath" />
4,然後在ant script中就可以方便的使用除了ant的core-task以外的其他tasks了。
需要注意的是:如果在ant中運行一個程式,例如自己寫的helloworld,其中使用了log4j類庫,則需要將log4j的jar加入到/lib下才能運行。
因為path的作用就是運行java程式時的classpath。不要試圖去修改CLASSPATH環境變數,這是關於使用ant的最著名的一個誤區。
所以ant外掛程式的本質就是:ant定義了一系列的介面,外掛程式是符合這些介面的java程式。當使用taskdef調用這些第三方java程式時,ant會自動load這些jar檔案,之後使用者就可以在ant script中使用這些外掛程式提供的方法了。
我見到的工具之一ant contrib:
http://ant-contrib.sourceforge.net/tasks/tasks/index.html
其中的trycatch和shellscript很有用。