1. 程式人生 > >轉發:Apache-Ant的使用

轉發:Apache-Ant的使用

ngs public java 博文 maven 編譯工具 androi 部署 大量

今天是第四天了,也是我在這裏的第一篇隨筆。

之前工作的項目中有用到Ant編譯、部署項目,卻沒怎麽去看過它的使用,在心裏就好像是一座山,感覺看明白很難,昨天看了一下build.xml文件的說明,明白了。很簡單。

特轉發此篇內容,以作記錄。gradle和maven還沒看。

一、什麽是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文件,並加入如下內容:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<target name="test">
<echo message="test echo messsage, basedir=${basedir}" />
</target>
</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>標簽,用於聲明鍵值對:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<target name="test-property">
<property name="name" value="zhangsan" />
<property name="age" value="25" />
<echo message="this is target test2." />
<echo message="java version: ${ant.java.version}" />
<echo message="project name: ${ant.project.name}" />
<echo message="ant file: ${ant.file}" />
<echo message="name = ${name}, age = ${age}" />
</target>
</project>
執行ant test-property命令後,結果如下圖:

<property>標簽用於聲明一個屬性,其中name為屬性名,value為屬性值,訪問屬性值時使用${屬性名}。
<copty>標簽,用於文件拷貝:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<target name="test-copy">
<copy file="test.txt" tofile="build/test.txt" />
</target>
</project>
執行ant test-copy命令後,結果如下圖所示:

<copy>標簽表示文件或文件夾的拷貝,上面的配置中,file屬性表示要拷貝的文件路徑,tofile屬性表示要拷貝的目的文件路徑。如果待拷貝的文件不存在,則命令執行會失敗,如果目的文件路徑不存在,則命令執行時會自動創建目錄。如果是要拷貝整個目錄,需要下面的配置:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<target name="test-copy-dir">
<copy todir="build/dest_dir">
<fileset dir="origin_dir" />
</copy>
</target>
</project>
執行ant test-copy-dir命令後,結果如下圖所示:

和單個文件的拷貝類似,如果待拷貝的目錄不存在,則命令執行會失敗,如果目的路徑不存在,則命令執行時會自動創建目錄。
<delete>標簽,用於文件或文件夾的刪除:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<!-- 刪除單個文件 -->
<target name="test-del-file">
<delete file="test.txt" />
</target>

<!-- 刪除整個目錄 -->
<target name="test-del-dir">
<delete dir="origin_dir" />
</target>
</project>
執行ant test-del-file和ant test-del-dir命令後,結果如下圖所示:

<mkdir>標簽,用於目錄的創建:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<target name="test-mkdir">
<mkdir dir="test" />
</target>
</project>
執行ant test-mkdir命令後,結果如下圖:

執行成功後在項目的目錄下出現了test目錄。
上面的幾種是ant操作文件的基本用法,但是ant的用法不僅僅只有這麽簡單而已,ant還可以編譯java文件,用法如下:
<javac>標簽,用於將.java文件編譯成.class文件:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<target name="test-compile">
<javac srcdir="src" destdir="build/classes/" />
</target>
</project>
srcdir指定了java源文件所在的路徑,destdir指定的是編譯後的class文件存放的路徑,這裏做一個簡單的測試,我們在src目錄下新建一個Test.java文件,內容為如下代碼:
public class Test {
public static void main(String[] args) {
System.out.println("HelloWorld!");
}
}
然後執行ant test-compile命令,結果如下圖:

第一次執行ant test-compile命令時,由於destdir目錄不存在,所以編譯不成功,在創建了build/classes/目錄後再次執行ant test-compile,命令執行成功,並且在build/classes/目錄下出現了Test.class文件。
ant能編譯java文件,自然也能運行java程序,用法如下:
<java>標簽,用於執行.class文件:
<?xml version="1.0"?>
<project name="HelloWorld" default="test" basedir="">
<target name="test-run-java">
<java classname="Test">
<classpath>
<pathelement path="build/classes" />
</classpath>
</java>
</target>
</project>
<java>標簽中的classname屬性,指定了要執行的main class名,<classpath>標簽中的<pathelement>標簽,指定了class文件的路徑。
執行ant test-run-java命令後,結果如下圖:

可以看到控制臺中打印了HelloWorld!,和我們在代碼中打印的一樣,證明這裏執行了java代碼。
<jar>標簽,用於將java程序打包成jar文件:
<?xml version="1.0"?>
<project name="add" default="jar">
<target name="jar">
<jar destfile="add.jar" basedir="build/classes/">
<manifest>
<attribute name="Main-class" value="Add" />
</manifest>
</jar>
</target>
</project>
<jar>標簽中的destfile屬性表示要生成的jar文件,basedir指定class文件的路徑,<manifest>標簽指定了jar包中的MANIFEST.MF文件中的屬性,裏面配置Main-class,即主class名稱為"Add"。
任務依賴:
使用ant執行任務時,我們肯定不會是一個個的執行,有時候會通過一次命令執行多個任務,比如下面的過程:
新建目錄->移動文件到該目錄->刪除原來的文件
這個過程其實是3個獨立的任務,為了一次執行這3個任務,需要用到<target>標簽中的depends屬性,首先上代碼:
<?xml version="1.0"?>
<project name="Test" default="delete-file">
<!--創建目錄-->
<target name="mkdir">
<mkdir dir="build/dest" />
</target>

<!--拷貝文件-->
<target name="copy-file" depends="mkdir">
<copy file="test.txt" tofile="build/dest/test.txt" />
</target>

<!--刪除文件-->
<target name="delete-file" depends="copy-file">
<delete file="test.txt" />
</target>
</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構建項目時,執行任務的過程。
---------------------
作者:yubo_725
來源:CSDN
原文:https://blog.csdn.net/yubo_725/article/details/52326746
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

轉發:Apache-Ant的使用