天天看點

項目建構工具之Ant的使用

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安裝成功: 

項目建構工具之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>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"step3"</code> <code>depends</code><code>=</code><code>"step1, step2"</code><code>/&gt;</code>

    if:該屬性指定一個屬性名,用屬性表示僅當設定了該屬性時才執行此target。例如:

<code>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"aaa"</code> <code>if</code><code>=</code><code>"prop1"</code><code>/&gt;</code>

    unless:和if相反,該屬性指定一個屬性名,表示僅當沒有設定改屬性時才執行此target。例如:

<code>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"bbb"</code> <code>unless</code><code>=</code><code>"prop2"</code> <code>/&gt;</code>

     description:指定該target的描述資訊。 

6. ant任務分為三類: 

核心任務:指ant自帶的任務 

可選任務:指來自第三方的任務,是以需要一個附件的jar檔案 

使用者自定義的任務:指使用者自己開發的任務 

7. &lt;project&gt;的子元素之&lt;property&gt;:用于定義一個或多個屬性 

ant生成檔案中的屬性類似于程式設計語言中的宏變量,他們都具有屬性名和屬性值。和程式設計語言不同的是,生成檔案中的值不可改變。定義一個屬性的最簡單的形式如下:

<code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"builddirectory"</code> <code>value</code><code>=</code><code>"/home/user/desktop"</code> <code>/&gt;</code>

      如果需要擷取該屬性值,使用${builddirectory}通路該變量即可。 

注意:美元符号"$"在ant生成檔案中具有特殊意義,如果希望将它當成普通的字元,應該使用"$",例如:

<code>&lt;</code><code>echo</code><code>&gt;$${builddirectory}=${builddirectory}&lt;/</code><code>echo</code><code>&gt;</code>

  上面的代碼中執行後會輸出:[echo] ${builddirectory}=/home/user/desktop 

 &lt;property&gt;可以接受如下幾個常用的屬性: 

 name:指定需要設定的屬性名 

    value:指定屬性值 

    resource:指定屬性檔案的資源名稱,ant将負責從屬性檔案中讀取屬性名和屬性值 

    file:指定屬性檔案的檔案名,ant将負責從屬性檔案中讀取屬性名和屬性值 

    url:指定屬性檔案的url位址,同樣,ant将負責從屬性檔案中讀取屬性名和屬性值 

    environment:用于指定系統環境變量的字首。通過這種方式允許ant通路系統的環境變量 

    classpath:指定搜尋屬性檔案的檔案和路徑集 

    classpathref:指定搜尋屬性檔案的檔案和路徑集引用,該屬性并不是直接給出系列檔案或路徑,而是給定檔案和路徑集引用 

下面給出幾個使用&lt;property&gt;元素的例子: 

&lt;property file="foo.poperties" /&gt; &lt;!-- 讀取foo.properties檔案中的屬性名和值 --&gt; 

&lt;property url="http://localhost:8080/web/jdbc.properties" /&gt; 

&lt;property&gt;元素所讀取的屬性檔案中,内容由一系列的name=value組成。 

&lt;property environment="env" /&gt; &lt;!-- 定義通路作業系統環境變量的字首是env --&gt; 

定義了上面的property以後,可以通過以下方式來通路作業系統的環境變量: 

&lt;echo&gt;${env.java_home}&lt;/echo&gt; 

8. &lt;project&gt;的子元素之&lt;path&gt;和&lt;classpath&gt;:用于定義一個或多個檔案和路徑 

通常,我們需要使用ant編譯、運作java檔案,這時常常引用到第三方的jar包,這就需要用到&lt;classpath&gt;元素了。&lt;path&gt;和&lt;classpath&gt;元素都用于定義檔案和路徑集,差別是,classpath元素通常作為其他任務的子元素,既可以引用已有的檔案和目錄集,也可以臨時定義一個檔案和目錄集;而&lt;path&gt;元素則作為&lt;project&gt;元素的子元素,用于定義一個獨立的、有名稱的檔案和目錄集,用于被引用。 

 &lt;path&gt;和&lt;classpath&gt;都用于手機系列的檔案和目錄集,都可接受如下的子元素: 

 &lt;pathelement&gt;:用于指定一個或多個目錄,可以指定如下兩個屬性中的一個: 

      path:指定一個或多個目錄(或者jar檔案),多個目錄或jar檔案直接以英文冒号或英文分号隔開 

      location:指定一個目錄和jar檔案(因為jar檔案哈可以包含更多層次的檔案結構,是以jar檔案實際上可以看成是一個檔案路徑) 

    &lt;dirset&gt;:采用模式字元串的方式指定多個目錄 

    &lt;fileset&gt;:采用模式字元串的方式指定多個檔案 

    &lt;filelist&gt;:采用直接給出系列檔案名的方式指定系列檔案 

8.1 &lt;pathelement&gt;元素 

如下是一個配置片段:  

2

<code>&lt;</code><code>pathelement</code> <code>path</code><code>=</code><code>"/path/to/file2.jar:/path/to/class2;/path/to/class3"</code> <code>/&gt;</code><code>&lt;!--注意第一個是檔案,後兩個是目錄 --&gt;</code> 

<code>&lt;</code><code>pathelement</code> <code>location</code><code>=</code><code>"lib/somejarfile.jar"</code> <code>/&gt;</code>

8.2 &lt;dirset&gt;元素 

如果要指定多個目錄,則應該使用&lt;dirset&gt;元素,該元素需要一個dir屬性,dir屬性指定該目錄集的根路徑。除此之外,dirset還可以使用&lt;include&gt;和&lt;exclude&gt;兩個子元素來指定包含和不包含哪些目錄,如下面的配置片段:

3

4

<code>&lt;</code><code>dirset</code> <code>dir</code><code>=</code><code>"build"</code><code>&gt; </code>

<code>   &lt;</code><code>include</code> <code>name</code><code>=</code><code>"apps/**/classes"</code> <code>/&gt; </code><code>&lt;!-- 包含build/apps下的所有目錄下的classes下的所有檔案 --&gt;</code> 

<code>   &lt;</code><code>exclude</code> <code>name</code><code>=</code><code>"apps/**/test"</code> <code>/&gt; </code><code>&lt;!-- 不包含build/apps下的子目錄中帶有test下的所有檔案 --&gt;</code> 

<code>&lt;/</code><code>dirset</code><code>&gt;</code>

8.3 &lt;filellist&gt;元素 

&lt;filelist&gt;元素需要指定如下兩個屬性: 

dir:指定檔案集裡多個檔案所在的基準路徑,這是一個必需的屬性 

files:多個檔案名清單,多個檔案名之間用英文逗号或者空格隔開 

如下是一個配置片段:

<code>&lt;</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>/&gt;</code>

  注意:幾乎所有的ant元素都可以指定兩個屬性:id和refid,其中id用于為元素指定一個唯一的辨別符,而refid用于指定引用另一個元素,例如下面的filelist配置:&lt;filelist refid="srcfiles" /&gt;,該filelist元素所包含的檔案集和前面的srcfiles包含的檔案完全一樣。 

實際上,&lt;filelist&gt;還允許使用多個&lt;file&gt;子元素來指定檔案清單,如下是一個配置片段:

<code>&lt;</code><code>filelist</code> <code>id</code><code>=</code><code>"srcfiles"</code> <code>dir</code><code>=</code><code>"${src.file}"</code><code>&gt; </code>

<code>   &lt;</code><code>file</code> <code>name</code><code>=</code><code>"foo.xml"</code><code>/&gt; </code>

<code>   &lt;</code><code>file</code> <code>name</code><code>=</code><code>"bar.xml"</code><code>/&gt; </code>

<code>&lt;/</code><code>filelist</code><code>&gt;</code>

8.4 &lt;fileset&gt;元素 

&lt;fileset&gt;元素可以指定兩個屬性: 

casesensitive:指定是否徐芬大小寫,預設區分大小寫 

除此之外,&lt;fileset&gt;元素中還可以使用&lt;include&gt;和&lt;exclude&gt;子元素來指定包含和不包含哪些檔案,如下是一個配置片段: 

<code>&lt;</code><code>fileset</code> <code>dir</code><code>=</code><code>"src"</code> <code>casesensitive</code><code>=</code><code>"yes"</code><code>&gt; </code><code>&lt;!-- 指定src路徑下的檔案集 --&gt;</code> 

<code>   &lt;</code><code>include</code> <code>name</code><code>=</code><code>"**/*.java"</code> <code>/&gt; </code><code>&lt;!-- 包含所有的java檔案 --&gt;</code> 

<code>   &lt;</code><code>exclude</code> <code>name</code><code>=</code><code>"**/*test*"</code> <code>/&gt; </code><code>&lt;!-- 排除所有檔案名中有test字元串的檔案 --&gt;</code> 

<code>&lt;/</code><code>fileset</code><code>&gt;</code>

  掌握了&lt;pathelement&gt;, &lt;dirset&gt;, &lt;filelist&gt;, &lt;fileset&gt;四個元素的用法之後,我們就可以将他們組合在一起使用了,這樣才能更靈活的适用于不同的選擇需求。 

9. ant的任務(task) 

每一個&lt;target&gt;由一個或多個task組成,task是&lt;target&gt;元素的核心。下面介紹一些常用的核心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所支援的屬性和選項以及它們的用法。