當(dāng)一個(gè)代碼項(xiàng)目大了以后,每次重新編譯,打包,測試等都會變得非常復(fù)雜而且重復(fù),因此c語言中有make腳本來幫助這些工作的批量完成。在Java 中應(yīng)用是平臺無關(guān)性的,當(dāng)然不會用平臺相關(guān)的make腳本來完成這些批處理任務(wù)了,ANT本身就是這樣一個(gè)流程腳本引擎,用于自動化調(diào)用程序完成項(xiàng)目的編譯,打包,測試等。除了基于JAVA是平臺無關(guān)的外,腳本的格式是基于XML的,比make腳本來說還要好維護(hù)一些。
每個(gè)ant腳本(缺省叫build.xml)中設(shè)置了一系列任務(wù)(target):比如對于一個(gè)一般的項(xiàng)目可能需要有以下任務(wù)。
* 任務(wù)1:usage 打印本腳本的幫助信息(缺省)
* 任務(wù)2:clean <-- init 清空初始化環(huán)境
* 任務(wù)3:javadoc <-- build <-- init 生成JAVADOC
* 任務(wù)4:jar <-- build <-- init 生成JAR
* 任務(wù)5:all <-- jar + javadoc <-- build <-- init 完成以上所有任務(wù):jar javadoc
而多個(gè)任務(wù)之間往往又包含了一定了依賴關(guān)系:比如把整個(gè)應(yīng)用打包任務(wù)(jar)的這個(gè)依賴于編譯任務(wù)(build),而編譯任務(wù)又依賴于整個(gè)環(huán)境初始化任務(wù)(init)等。
注:我看到很多項(xiàng)目的ant腳本中的命名基本上都是一致的,比如:編譯一般叫build或者compile;打包一般叫jar或war;生成文檔一般命名為 javadoc或javadocs;執(zhí)行全部任務(wù)all。在每個(gè)任務(wù)的中,ANT會根據(jù)配置調(diào)用一些外部應(yīng)用并配以相應(yīng)參數(shù)執(zhí)行。雖然ANT可調(diào)用的外部應(yīng)用種類非常豐富,但其實(shí)最常用的就2,3個(gè):比如javac javadoc jar等。
?
?
Ant 開發(fā)
Ant的構(gòu)建文件
當(dāng)開始一個(gè)新的項(xiàng)目時(shí),首先應(yīng)該編寫Ant構(gòu)建文件。構(gòu)建文件定義了構(gòu)建過程,并被團(tuán)隊(duì)開發(fā)中每個(gè)人使用。Ant構(gòu)建文件默認(rèn)命名為build.xml,也可以取其他的名字。只不過在運(yùn)行的時(shí)候把這個(gè)命名當(dāng)作參數(shù)傳給Ant。構(gòu)建文件可以放在任何的位置。一般做法是放在項(xiàng)目頂層目錄中,這樣可以保持項(xiàng)目的簡潔和清晰。下面是一個(gè)典型的項(xiàng)目層次結(jié)構(gòu)。
(1) src存放文件。
(2) class存放編譯后的文件。
(3) lib存放第三方JAR包。
(4) dist存放打包,發(fā)布以后的代碼。
Ant構(gòu)建文件是XML文件。每個(gè)構(gòu)建文件定義一個(gè)唯一的項(xiàng)目(Project元素)。每個(gè)項(xiàng)目下可以定義很多目標(biāo)(target元素),這些目標(biāo)之間可以有依賴關(guān)系。當(dāng)執(zhí)行這類目標(biāo)時(shí),需要執(zhí)行他們所依賴的目標(biāo)。
每個(gè)目標(biāo)中可以定義多個(gè)任務(wù),目標(biāo)中還定義了所要執(zhí)行的任務(wù)序列。Ant在構(gòu)建目標(biāo)時(shí)必須調(diào)用所定義的任務(wù)。任務(wù)定義了Ant實(shí)際執(zhí)行的命令。Ant中的任務(wù)可以為3類。
(1) 核心任務(wù)。核心任務(wù)是Ant自帶的任務(wù)。
(2) 可選任務(wù)。可選任務(wù)實(shí)來自第三方的任務(wù),因此需要一個(gè)附加的JAR文件。
(3) 用戶自定義的任務(wù)。用戶自定義的任務(wù)實(shí)用戶自己開發(fā)的任務(wù)。
1.<project>標(biāo)簽
每個(gè)構(gòu)建文件對應(yīng)一個(gè)項(xiàng)目。<project>標(biāo)簽時(shí)構(gòu)建文件的根標(biāo)簽。它可以有多個(gè)內(nèi)在屬性,就如代碼中所示,其各個(gè)屬性的含義分別如下。
(1) default表示默認(rèn)的運(yùn)行目標(biāo),這個(gè)屬性是必須的。
(2) basedir表示項(xiàng)目的基準(zhǔn)目錄。
(3) name表示項(xiàng)目名。
(4) description表示項(xiàng)目的描述。
每個(gè)構(gòu)建文件都對應(yīng)于一個(gè)項(xiàng)目,但是大型項(xiàng)目經(jīng)常包含大量的子項(xiàng)目,每一個(gè)子項(xiàng)目都可以有自己的構(gòu)建文件。
2.<target>標(biāo)簽
一個(gè)項(xiàng)目標(biāo)簽下可以有一個(gè)或多個(gè)target標(biāo)簽。一個(gè)target標(biāo)簽可以依賴其他的target標(biāo)簽。
例如,有一個(gè)target用于編譯程序,另一個(gè)target用于聲稱可執(zhí)行文件。在生成可執(zhí)行文件之前必須先編譯該文件,因策可執(zhí)行文件的target依賴于編譯程序的target。Target的所有屬性如下。
(1).name表示標(biāo)明,這個(gè)屬性是必須的。
(2).depends表示依賴的目標(biāo)。
(3)if表示僅當(dāng)屬性設(shè)置時(shí)才執(zhí)行。
(4)unless表示當(dāng)屬性沒有設(shè)置時(shí)才執(zhí)行。
(5)description表示項(xiàng)目的描述。
Ant的depends屬性指定了target的執(zhí)行順序。Ant會依照depends屬性中target出現(xiàn)順序依次執(zhí)行每個(gè)target。在執(zhí)行之前,首先需要執(zhí)行它所依賴的target。程序中的名為run的target的depends屬性compile,而名為compile的target的depends屬性是prepare,所以這幾個(gè)target執(zhí)行的順序是prepare->compile->run。
一個(gè)target只能被執(zhí)行一次,即使有多個(gè)target依賴于它。如果沒有if或unless屬性,target總會被執(zhí)行。
3.<mkdir>標(biāo)簽
該標(biāo)簽用于創(chuàng)建一個(gè)目錄,它有一個(gè)屬性dir用來指定所創(chuàng)建的目錄名,其代碼如下:
<mkdir dir=”${class.root}”/>
通過以上代碼就創(chuàng)建了一個(gè)目錄,這個(gè)目錄已經(jīng)被前面的property標(biāo)簽所指定。
4<jar>標(biāo)簽
該標(biāo)簽用來生成一個(gè)JAR文件,其屬性如下。
(1) destfile表示JAR文件名。
(2) basedir表示被歸檔的文件名。
(3) includes表示別歸檔的文件模式。
(4) exchudes表示被排除的文件模式。
5.<javac標(biāo)簽>
該標(biāo)簽用于編譯一個(gè)或一組java文件,其屬性如下。
(1).srcdir表示源程序的目錄。
(2).destdir表示class文件的輸出目錄。
(3).include表示被編譯的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的類路徑。
(6).debug表示包含的調(diào)試信息。
(7).optimize表示是否使用優(yōu)化。
(8).verbose 表示提供詳細(xì)的輸出信息。
(9).fileonerror表示當(dāng)碰到錯(cuò)誤就自動停止。
6.<java>標(biāo)簽
該標(biāo)簽用來執(zhí)行編譯生成的.class文件,其屬性如下。
(1).classname 表示將執(zhí)行的類名。
(2).jar表示包含該類的JAR文件名。
(3).classpath所表示用到的類路徑。
(4).fork表示在一個(gè)新的虛擬機(jī)中運(yùn)行該類。
(5).failonerror表示當(dāng)出現(xiàn)錯(cuò)誤時(shí)自動停止。
(6).output 表示輸出文件。
(7).append表示追加或者覆蓋默認(rèn)文件。
7.<delete>標(biāo)簽
該標(biāo)簽用于刪除一個(gè)文件或一組文件,其屬性如下。
(1)/file表示要刪除的文件。
(2).dir表示要刪除的目錄。
(3).includeEmptyDirs 表示指定是否要刪除空目錄,默認(rèn)值是刪除。
(4).failonerror 表示指定當(dāng)碰到錯(cuò)誤是否停止,默認(rèn)值是自動停止。
(5).verbose表示指定是否列出所刪除的文件,默認(rèn)值為不列出。
8.<copy>標(biāo)簽
該標(biāo)簽用于文件或文件集的拷貝,其屬性如下。
(1).file 表示源文件。
(2).tofile 表示目標(biāo)文件。
(3).todir 表示目標(biāo)目錄。
(4).overwrite 表示指定是否覆蓋目標(biāo)文件,默認(rèn)值是不覆蓋。
(5).includeEmptyDirs 表示制定是否拷貝空目錄,默認(rèn)值為拷貝。
(6).failonerror 表示指定如目標(biāo)沒有發(fā)現(xiàn)是否自動停止,默認(rèn)值是停止。
(7).verbose 表示制定是否顯示詳細(xì)信息,默認(rèn)值不顯示。
?
?
Ant 的安裝
解包后在系統(tǒng)可執(zhí)行路徑中加入指向ant的bin的路徑就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:
export ANT_HOME=/home/ant
export JAVA_HOME=/usr/java/j2sdk1.4.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin
Windows 下的安裝:
下載后解壓到某個(gè)目錄我這里以D:\apache-ant-1.7.1為例子:
添加path全局環(huán)境變量:D:\apache-ant-1.7.1\bin
這樣在command line就可以運(yùn)行ant命令了
測試:運(yùn)行->cmd/command->ant 如果沒有安裝成功則回報(bào)找不到這個(gè)命令,安裝成功會有相關(guān)的提示信息顯示。
這樣執(zhí)行ant 后,如果不指定配置文件ant會缺省找build.xml這個(gè)配置文件,并根據(jù)配置文件執(zhí)行任務(wù),缺省的任務(wù)設(shè)置可以指向最常用的任務(wù),比如: build,或指向打印幫助信息:usage,告訴用戶有那些腳本選項(xiàng)可以使用。
Ant 的運(yùn)行
安裝好Ant并且配置好路徑之后,在命令行中切換到構(gòu)建文件的目錄,輸入Ant命令就可以運(yùn)行Ant.若沒有指定任何參數(shù),Ant會在當(dāng)前目錄下查詢build.xml文件。如果找到了就用該文件作為構(gòu)建文件。如果使用了 –find 選項(xiàng),Ant 就會在上級目錄中找構(gòu)建文件,直至到達(dá)文件系統(tǒng)的根目錄。如果構(gòu)建文件的名字不是build.xml ,則Ant運(yùn)行的時(shí)候就可以使用 –buildfile file,這里file 指定了要使用的構(gòu)建文件的名稱,示例如下:
Ant如下說明了表示當(dāng)前目錄的構(gòu)建文件為build.xml 運(yùn)行 ant 執(zhí)行默認(rèn)的目標(biāo)。
Ant –buildfile test.xml
使用當(dāng)前目錄下的test.xml 文件運(yùn)行Ant ,執(zhí)行默認(rèn)的目標(biāo)