1.下載下傳
2.解壓
将下載下傳的檔案解壓到任意目錄,解壓縮後看到如下檔案結構:
bin:啟動和運作ant的可執行指令
docs:ant工具的相關文檔,這些文檔對于學習ant有很大的作用
etc:包含一些樣式單檔案,通常無需理會該目錄下的檔案
lib:包含ant的核心類庫,以及編譯和運作ant是以來的第三方類庫
license等說明性文檔
3.配置環境變量
在使用ant之前,請確定已經正确的安裝了jdk, 并且正确的配置了%java_home% , 另外,還需要配置%ant_home%,這個變量指向剛剛解壓的檔案夾目錄,配置的過程和%java_home%相同。
ant工具的關鍵指令就是%ant_home%/bin下的ant.bat(linux版為ant.sh)指令,如果希望作業系統可以識别該指令,可以将%ant_home%/bin路徑添加到作業系統的path環境變量之中。
配置好以後,可以直接在指令行裡面輸入ant,如果看到如下内容,則說明ant安裝成功:
4. ant常用參數
ant -find/-s 在上級目錄中搜尋生成檔案,直到達到檔案系統的根路徑
ant -file/-f 使用指定的檔案名作為項目的生成檔案
ant -logfile/-l 使用指定的檔案名作為ant的日志輸入檔案
ant -keep-going/-k 執行所有不依賴于出錯的target的target
ant -help 打開ant工具的幫助菜單
....
更多指令詳情,請在指令行輸入ant -help檢視.
可以在使用ant指令的時候傳入參數:例如:
ant -denv=%ant_home%,這裡傳入了一個叫做env的參數,之後可以在生成檔案中通過$env得到這個值,這是windows中的寫法,
在linux系統中,則使用ant -devn=$ant_home。
在預設情況下,ant将運作生成檔案裡面指定的預設target,如果希望運作ant時指定需要執行的target,可以使用如下指令格式:
ant [target [target2 [target3] ...]]
5. 關于生成檔案build.xml
使用ant的關鍵就是編寫生成檔案,生成檔案定義了該項目的各個生成任務(target),并定義生成任務之間的關系。ant預設的生成檔案名為build.xml,也可以使用其他的名字。生成檔案可以放在任意的檔案夾中,但通常的做法是放在項目的頂層目錄中。
build.xml檔案的根元素是<project.../>,一個<project>元素中可以定義多個<target>,每個<target>又可能由一個或多個任務序列組成,當執行某個<target>時,實際上就是一次執行該目标所包含的全部任務,每個任務由一段可執行的代碼組成。
<project>元素中常見的屬性:
default:指定預設的target,這個屬性是必須的,如果運作ant指令時沒有顯式指定執行的target,将執行這個預設的target
basedir:指定項目的基準路徑,生成檔案中的其他相對路徑都是基于該路徑的、
name:指定項目名,該屬性僅僅指定一個名字,對編譯和項目的生成沒有太大的實際作用
description:指定項目的描述性喜,同樣對編譯和項目的生成沒有太大的實際作用
<target>元素中常見的屬性:
name:指定該target的名稱,該屬性是必須的,而且非常重要,這個名稱可以被其他的target引用,而且,在一個build.xml檔案中,target的名稱應該唯一
depends:該小戶型可以指定一個或多個target名,表示目前target依賴于這些target,執行該target之前應該先執行該depends屬性所指定的每一個target。例如:
<a href="http://my.oschina.net/itblog/blog/203755#">?</a>
1
<code><</code><code>target</code> <code>name</code><code>=</code><code>"step3"</code> <code>depends</code><code>=</code><code>"step1, step2"</code><code>/></code>
if:該屬性指定一個屬性名,用屬性表示僅當設定了該屬性時才執行此target。例如:
<code><</code><code>target</code> <code>name</code><code>=</code><code>"aaa"</code> <code>if</code><code>=</code><code>"prop1"</code><code>/></code>
unless:和if相反,該屬性指定一個屬性名,表示僅當沒有設定改屬性時才執行此target。例如:
<code><</code><code>target</code> <code>name</code><code>=</code><code>"bbb"</code> <code>unless</code><code>=</code><code>"prop2"</code> <code>/></code>
description:指定該target的描述資訊。
6. ant任務分為三類:
核心任務:指ant自帶的任務
可選任務:指來自第三方的任務,是以需要一個附件的jar檔案
使用者自定義的任務:指使用者自己開發的任務
7. <project>的子元素之<property>:用于定義一個或多個屬性
ant生成檔案中的屬性類似于程式設計語言中的宏變量,他們都具有屬性名和屬性值。和程式設計語言不同的是,生成檔案中的值不可改變。定義一個屬性的最簡單的形式如下:
<code><</code><code>property</code> <code>name</code><code>=</code><code>"builddirectory"</code> <code>value</code><code>=</code><code>"/home/user/desktop"</code> <code>/></code>
如果需要擷取該屬性值,使用${builddirectory}通路該變量即可。
注意:美元符号"$"在ant生成檔案中具有特殊意義,如果希望将它當成普通的字元,應該使用"$",例如:
<code><</code><code>echo</code><code>>$${builddirectory}=${builddirectory}</</code><code>echo</code><code>></code>
上面的代碼中執行後會輸出:[echo] ${builddirectory}=/home/user/desktop
<property>可以接受如下幾個常用的屬性:
name:指定需要設定的屬性名
value:指定屬性值
resource:指定屬性檔案的資源名稱,ant将負責從屬性檔案中讀取屬性名和屬性值
file:指定屬性檔案的檔案名,ant将負責從屬性檔案中讀取屬性名和屬性值
url:指定屬性檔案的url位址,同樣,ant将負責從屬性檔案中讀取屬性名和屬性值
environment:用于指定系統環境變量的字首。通過這種方式允許ant通路系統的環境變量
classpath:指定搜尋屬性檔案的檔案和路徑集
classpathref:指定搜尋屬性檔案的檔案和路徑集引用,該屬性并不是直接給出系列檔案或路徑,而是給定檔案和路徑集引用
下面給出幾個使用<property>元素的例子:
<property file="foo.poperties" /> <!-- 讀取foo.properties檔案中的屬性名和值 -->
<property url="http://localhost:8080/web/jdbc.properties" />
<property>元素所讀取的屬性檔案中,内容由一系列的name=value組成。
<property environment="env" /> <!-- 定義通路作業系統環境變量的字首是env -->
定義了上面的property以後,可以通過以下方式來通路作業系統的環境變量:
<echo>${env.java_home}</echo>
8. <project>的子元素之<path>和<classpath>:用于定義一個或多個檔案和路徑
通常,我們需要使用ant編譯、運作java檔案,這時常常引用到第三方的jar包,這就需要用到<classpath>元素了。<path>和<classpath>元素都用于定義檔案和路徑集,差別是,classpath元素通常作為其他任務的子元素,既可以引用已有的檔案和目錄集,也可以臨時定義一個檔案和目錄集;而<path>元素則作為<project>元素的子元素,用于定義一個獨立的、有名稱的檔案和目錄集,用于被引用。
<path>和<classpath>都用于手機系列的檔案和目錄集,都可接受如下的子元素:
<pathelement>:用于指定一個或多個目錄,可以指定如下兩個屬性中的一個:
path:指定一個或多個目錄(或者jar檔案),多個目錄或jar檔案直接以英文冒号或英文分号隔開
location:指定一個目錄和jar檔案(因為jar檔案哈可以包含更多層次的檔案結構,是以jar檔案實際上可以看成是一個檔案路徑)
<dirset>:采用模式字元串的方式指定多個目錄
<fileset>:采用模式字元串的方式指定多個檔案
<filelist>:采用直接給出系列檔案名的方式指定系列檔案
8.1 <pathelement>元素
如下是一個配置片段:
2
<code><</code><code>pathelement</code> <code>path</code><code>=</code><code>"/path/to/file2.jar:/path/to/class2;/path/to/class3"</code> <code>/></code><code><!--注意第一個是檔案,後兩個是目錄 --></code>
<code><</code><code>pathelement</code> <code>location</code><code>=</code><code>"lib/somejarfile.jar"</code> <code>/></code>
8.2 <dirset>元素
如果要指定多個目錄,則應該使用<dirset>元素,該元素需要一個dir屬性,dir屬性指定該目錄集的根路徑。除此之外,dirset還可以使用<include>和<exclude>兩個子元素來指定包含和不包含哪些目錄,如下面的配置片段:
3
4
<code><</code><code>dirset</code> <code>dir</code><code>=</code><code>"build"</code><code>> </code>
<code> <</code><code>include</code> <code>name</code><code>=</code><code>"apps/**/classes"</code> <code>/> </code><code><!-- 包含build/apps下的所有目錄下的classes下的所有檔案 --></code>
<code> <</code><code>exclude</code> <code>name</code><code>=</code><code>"apps/**/test"</code> <code>/> </code><code><!-- 不包含build/apps下的子目錄中帶有test下的所有檔案 --></code>
<code></</code><code>dirset</code><code>></code>
8.3 <filellist>元素
<filelist>元素需要指定如下兩個屬性:
dir:指定檔案集裡多個檔案所在的基準路徑,這是一個必需的屬性
files:多個檔案名清單,多個檔案名之間用英文逗号或者空格隔開
如下是一個配置片段:
<code><</code><code>filelist</code> <code>id</code><code>=</code><code>"srcfiles"</code> <code>dir</code><code>=</code><code>"src"</code> <code>files</code><code>=</code><code>"foo.xml, bar.xml"</code> <code>/></code>
注意:幾乎所有的ant元素都可以指定兩個屬性:id和refid,其中id用于為元素指定一個唯一的辨別符,而refid用于指定引用另一個元素,例如下面的filelist配置:<filelist refid="srcfiles" />,該filelist元素所包含的檔案集和前面的srcfiles包含的檔案完全一樣。
實際上,<filelist>還允許使用多個<file>子元素來指定檔案清單,如下是一個配置片段:
<code><</code><code>filelist</code> <code>id</code><code>=</code><code>"srcfiles"</code> <code>dir</code><code>=</code><code>"${src.file}"</code><code>> </code>
<code> <</code><code>file</code> <code>name</code><code>=</code><code>"foo.xml"</code><code>/> </code>
<code> <</code><code>file</code> <code>name</code><code>=</code><code>"bar.xml"</code><code>/> </code>
<code></</code><code>filelist</code><code>></code>
8.4 <fileset>元素
<fileset>元素可以指定兩個屬性:
casesensitive:指定是否徐芬大小寫,預設區分大小寫
除此之外,<fileset>元素中還可以使用<include>和<exclude>子元素來指定包含和不包含哪些檔案,如下是一個配置片段:
<code><</code><code>fileset</code> <code>dir</code><code>=</code><code>"src"</code> <code>casesensitive</code><code>=</code><code>"yes"</code><code>> </code><code><!-- 指定src路徑下的檔案集 --></code>
<code> <</code><code>include</code> <code>name</code><code>=</code><code>"**/*.java"</code> <code>/> </code><code><!-- 包含所有的java檔案 --></code>
<code> <</code><code>exclude</code> <code>name</code><code>=</code><code>"**/*test*"</code> <code>/> </code><code><!-- 排除所有檔案名中有test字元串的檔案 --></code>
<code></</code><code>fileset</code><code>></code>
掌握了<pathelement>, <dirset>, <filelist>, <fileset>四個元素的用法之後,我們就可以将他們組合在一起使用了,這樣才能更靈活的适用于不同的選擇需求。
9. ant的任務(task)
每一個<target>由一個或多個task組成,task是<target>元素的核心。下面介紹一些常用的核心task:
javac:用于編譯一個或多個java源檔案,通常需要srcdir和destdir兩個屬性,用于指定java源檔案的位置和編譯後class檔案儲存的位置
java:用于運作某個java類,通常需要classname屬性,用于指定需要運作哪個類
jar:用于生成jar包,通常需要destfile屬性,用于指定所建立jar包的檔案名;除此之外,還需要指定一個檔案集,用于指定需要将哪些檔案打包到jar檔案中
sql:用于執行一條或多條sql語句,通常需要driver, url, userid和password等屬性,還可以通過src屬性來指定需要執行的sqll腳本檔案,或者直接使用文本内容的方式指定sql腳本字元串
echo:用于輸出某個字元串
exec:執行作業系統的特定指令,通常需要executable屬性,用于指定想執行的指令
copy:用于複制檔案或路徑
delete:用于删除檔案或路徑
mkdir:用于建立檔案夾
move:用于移動檔案或目錄
另外, %ant_home%/docs/manual/coretasks路徑下包含了ant所有核心task的詳細介紹,%ant_home%/docs/manual/optionaltask路徑下包含了ant所有可選task的詳細介紹,同學們可以參考這些文檔來了解各個task所支援的屬性和選項以及它們的用法。