1. 程式人生 > >Apache Ant的基礎使用

Apache Ant的基礎使用

轉載  https://blog.csdn.net/yubo_725/article/details/52326746

 

一、什麼是Ant

以下介紹來自百度百科:

Apache Ant,是一個將軟體編譯、測試、部署等步驟聯絡在一起加以自動化的一個工具,大多用於Java環境中的軟體開發。由Apache軟體基金會所提供。

我們在使用Eclipse開發Android應用時,Eclipse使用的專案構建工具就是Ant。

使用者群:大多數的Java設計都被用於管理大量資訊流,例如紐約州就使用Apache Ant去管理美國最大的青年計劃,每天可以實時更新超過25萬學生的記錄。
只要使用過Linux系統的讀者,應該知道 make這個命令。當編譯Linux核心及一些軟體的源程式時,經常要用這個命令。Make命令其實就 是一個專案管理工具,而Ant所實現功能與此類似。像make,gnumake和nmake這些編譯工具都有 一定的缺陷,但是Ant卻克服了這些工具的缺陷。最初Ant開發者在開發跨平臺的應用時,同樣也 是基於這些缺陷對Ant做了更好的設計。

二、Ant的優點

Ant是Apache軟體基金會JAKARTA目錄中的一個子專案,它有以下的優點:

跨平臺性。Ant是純Java語言編寫的,所以具有很好的跨平臺性。

操作簡單。Ant是由一個內建任務和可選任務組成的。Ant執行時需要一個XML檔案(構建檔案)。 Ant通過呼叫target樹,就可以執行各種task。每個task實現了特定介面物件。由於Ant構建檔案 是XML格式的檔案,所以很容易維護和書寫,而且結構很清晰。Ant可以整合到開發環境中。由於Ant的跨平臺性和操作簡單的特點,它很容易整合到一些開發環 境中去。

三、Ant的基本使用方法

下面介紹Ant的基本使用方法:

1、首先需要從官網下載apache ant,地址為:http://ant.apache.org/bindownload.cgi

2、下載後的壓縮檔案直接解壓後放到硬碟的目錄下就行,然後是配置Ant的環境變數,因為我們需要在命令列下使用ant命令,所以需要將ant的目錄加入path環境變數中,步驟如下(windows10系統):

(1)滑鼠右擊桌面“此電腦”,選擇屬性,然後在出現的視窗左側選擇“高階系統設定”,在彈出的視窗中選擇“環境變數”

(2)在環境變數配置視窗中的“使用者變數”中新增一個變數名為ANT_HOME,值為Ant解壓後的目錄,如下圖所示:

然後在“使用者變數”下找PATH變數,如果沒有就新增一個PATH變數,如果有就直接在PATH變數中加入新的值,值為“%ANT_HOME%\bin”

經過上面2步就配置好了Ant的環境變量了,cmd中執行ant -version命令後,如下圖所示則表示配置成功:

3、開始使用Ant。

Ant的核心就是配置檔案build.xml,在build.xml檔案中配置相關的任務後,使用ant命令即可自動執行,所以我們需要掌握ant的相關配置,這裡先在桌面新建一個目錄TestAnt,然後進入該目錄,新建一個build.xml檔案,並加入如下內容:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <target name="test">

  4. <echo message="test echo messsage, basedir=${basedir}" />

  5. </target>

  6. </project>

在命令列下我們進入上面build.xml所在的目錄,然後執行ant命令,會出現如下圖所示的結果:

下面就來解釋上面的build.xml檔案的配置:

(1)build.xml需要遵循一定的格式,這樣ant命令才能正確執行,一個build.xml檔案是以<project>標籤為根節點的,<project>節點中可以指定name屬性,表示專案的名稱,basedir代表專案的根目錄,default表示專案的預設任務名,這裡的default屬性值為test,則執行ant命令時會找default對應的target去執行(如果ant命令沒有指定任務名的話)。

(2)<project>標籤中定義了一個<target>標籤,該標籤表示的就是一個任務,<target>標籤中的name屬性表示任務名,我們可以在命令列下直接使用ant + 任務名來執行某個特定的任務,例如上面的例子中,我們可以使用ant test命令去執行name值為test的target任務,由於我們在<project>標籤中配置了default屬性為test,所以在命令列下只需要執行ant命令就可以執行test任務了。

(3)<echo>標籤表示在命令列下輸出,類似於java中的System.out.println(),在<echo>標籤中配置message屬性後即可在命令列下列印該屬性的值。如上圖中顯示的[echo],即為我們配置的message屬性的值。

(4)使用${}可以獲取某個變數的值,花括號中為變數名,如上圖中打印出的C:\Users\yubo7\Desktop\TestAnt,即為basedir的值,由於在<project>標籤中我們給basedir屬性的值為空,所以basedir的值預設為build.xml所在的路徑。

上面的例子是一個最基本的build.xml檔案的結構,build.xml檔案還有很多配置項,下面舉例幾個配置項:

<property>標籤,用於宣告鍵值對:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <target name="test-property">

  4. <property name="name" value="zhangsan" />

  5. <property name="age" value="25" />

  6. <echo message="this is target test2." />

  7. <echo message="java version: ${ant.java.version}" />

  8. <echo message="project name: ${ant.project.name}" />

  9. <echo message="ant file: ${ant.file}" />

  10. <echo message="name = ${name}, age = ${age}" />

  11. </target>

  12. </project>

執行ant test-property命令後,結果如下圖:


<property>標籤用於宣告一個屬性,其中name為屬性名,value為屬性值,訪問屬性值時使用${屬性名}。

<copty>標籤,用於檔案拷貝:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <target name="test-copy">

  4. <copy file="test.txt" tofile="build/test.txt" />

  5. </target>

  6. </project>

執行ant test-copy命令後,結果如下圖所示:


<copy>標籤表示檔案或資料夾的拷貝,上面的配置中,file屬性表示要拷貝的檔案路徑,tofile屬性表示要拷貝的目的檔案路徑。如果待拷貝的檔案不存在,則命令執行會失敗,如果目的檔案路徑不存在,則命令執行時會自動建立目錄。如果是要拷貝整個目錄,需要下面的配置:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <target name="test-copy-dir">

  4. <copy todir="build/dest_dir">

  5. <fileset dir="origin_dir" />

  6. </copy>

  7. </target>

  8. </project>

執行ant test-copy-dir命令後,結果如下圖所示:

和單個檔案的拷貝類似,如果待拷貝的目錄不存在,則命令執行會失敗,如果目的路徑不存在,則命令執行時會自動建立目錄。

<delete>標籤,用於檔案或資料夾的刪除:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <!-- 刪除單個檔案 -->

  4. <target name="test-del-file">

  5. <delete file="test.txt" />

  6. </target>

  7.  
  8. <!-- 刪除整個目錄 -->

  9. <target name="test-del-dir">

  10. <delete dir="origin_dir" />

  11. </target>

  12. </project>

執行ant test-del-file和ant test-del-dir命令後,結果如下圖所示:


<mkdir>標籤,用於目錄的建立:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <target name="test-mkdir">

  4. <mkdir dir="test" />

  5. </target>

  6. </project>

執行ant test-mkdir命令後,結果如下圖:


執行成功後在專案的目錄下出現了test目錄。

上面的幾種是ant操作檔案的基本用法,但是ant的用法不僅僅只有這麼簡單而已,ant還可以編譯java檔案,用法如下:

<javac>標籤,用於將.java檔案編譯成.class檔案:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <target name="test-compile">

  4. <javac srcdir="src" destdir="build/classes/" />

  5. </target>

  6. </project>

srcdir指定了java原始檔所在的路徑,destdir指定的是編譯後的class檔案存放的路徑,這裡做一個簡單的測試,我們在src目錄下新建一個Test.java檔案,內容為如下程式碼:

 
  1. public class Test {

  2. public static void main(String[] args) {

  3. System.out.println("HelloWorld!");

  4. }

  5. }

然後執行ant test-compile命令,結果如下圖:


第一次執行ant test-compile命令時,由於destdir目錄不存在,所以編譯不成功,在建立了build/classes/目錄後再次執行ant test-compile,命令執行成功,並且在build/classes/目錄下出現了Test.class檔案。
ant能編譯java檔案,自然也能執行java程式,用法如下:

<java>標籤,用於執行.class檔案:

 
  1. <?xml version="1.0"?>

  2. <project name="HelloWorld" default="test" basedir="">

  3. <target name="test-run-java">

  4. <java classname="Test">

  5. <classpath>

  6. <pathelement path="build/classes" />

  7. </classpath>

  8. </java>

  9. </target>

  10. </project>

<java>標籤中的classname屬性,指定了要執行的main class名,<classpath>標籤中的<pathelement>標籤,指定了class檔案的路徑。

執行ant test-run-java命令後,結果如下圖:


可以看到控制檯中列印了HelloWorld!,和我們在程式碼中列印的一樣,證明這裡執行了java程式碼。

<jar>標籤,用於將java程式打包成jar檔案:

 
  1. <?xml version="1.0"?>

  2. <project name="add" default="jar">

  3. <target name="jar">

  4. <jar destfile="add.jar" basedir="build/classes/">

  5. <manifest>

  6. <attribute name="Main-class" value="Add" />

  7. </manifest>

  8. </jar>

  9. </target>

  10. </project>

<jar>標籤中的destfile屬性表示要生成的jar檔案,basedir指定class檔案的路徑,<manifest>標籤指定了jar包中的MANIFEST.MF檔案中的屬性,裡面配置Main-class,即主class名稱為"Add"。

任務依賴:

使用ant執行任務時,我們肯定不會是一個個的執行,有時候會通過一次命令執行多個任務,比如下面的過程:

新建目錄->移動檔案到該目錄->刪除原來的檔案

這個過程其實是3個獨立的任務,為了一次執行這3個任務,需要用到<target>標籤中的depends屬性,首先上程式碼:

 
  1. <?xml version="1.0"?>

  2. <project name="Test" default="delete-file">

  3. <!--建立目錄-->

  4. <target name="mkdir">

  5. <mkdir dir="build/dest" />

  6. </target>

  7.  
  8. <!--拷貝檔案-->

  9. <target name="copy-file" depends="mkdir">

  10. <copy file="test.txt" tofile="build/dest/test.txt" />

  11. </target>

  12.  
  13. <!--刪除檔案-->

  14. <target name="delete-file" depends="copy-file">

  15. <delete file="test.txt" />

  16. </target>

  17. </project>

上面的配置檔案中有三個任務,其中copy-file任務和delete-file任務中都含有depends屬性,該屬性表示執行<target>中的任務時,要依賴depends中指定的任務(depends中指定的任務會先執行),depends屬性值就是一個任務名,所以上面的配置檔案表示:執行delete-file任務時需要依賴copy-file任務,而執行copy-file任務時需要依賴mkdir任務,<project>標籤中的default值為delete-file,則我們執行ant命令時,會找到delete-file任務,但是這個任務又依賴別的任務,則被依賴的任務會先執行,所以上面的配置檔案執行的順序為:mkdir-->copy-file-->delete-file。

 

更多Ant的用法可以參考官方文件:http://ant.apache.org/manual/index.html

 

以上就是ant的基本用法,下一篇中會記錄Eclipse使用ant構建專案時,執行任務的過程。