ANT標籤詳解

yangxi_001發表於2014-03-26

1、<project>標籤 
每個構建檔案對應一個專案,project標籤是構建檔案的跟標籤,它可以有多個內在屬性,各個屬性的含義分別如下所示: 
default表示預設的執行目標,這個屬性是必須的。 
basedir表示專案的基準路徑,這個屬性是必須的。 
name表示專案名稱。 
description表示專案的描述(或者是對這個標籤的作用進行表述)。 
每個構建檔案都對應於一個專案,但是大型專案經常包含大量的子專案,每一個子專案都可以有自己的構建檔案。 

2、<target>標籤 
一個專案標籤下可以有一個或多個target標籤,一個target標籤可以依賴其他target標籤,target所有屬性如下所示: 
name表示這個標籤的名字,這個屬性是必須的。 
depends表示依賴的目標。 
if表示僅當屬性設定時才執行。 
unless表示當屬性沒有設定時才執行。 
description表示專案的描述(或者是對這個標籤的作用進行表述)。 

Ant的depends屬性指定了target的執行順序,Ant會依照depends屬性中target標籤出現順序依次執行每個target,在執行之前首先執行它所依賴的target標籤,例如:
專案中的名為run的target的depends屬性compile,而名為compile的target的depends屬性是init,所以這幾個target標籤的執行順序是init—》compile—》run。一個target只能被執行一次,即使有多個target依賴於它。如果沒有if或unless屬性,target總會被執行。


3、<mkdir>標籤 
    該標籤使用者建立一個目錄,它有一個屬性dir使用者指定所建立的目錄,其程式碼如下: 
    <mkdir dir="目錄名"/>


4、<jar>標籤 
該標籤用來生成一個JAR包,其屬性如下: 
jarfile表示生產JAR檔名。 
basedir表示被歸檔的目錄。 
includes表示別歸檔的檔案模式。 
exchudes表示被排除的檔案模式。 

5、<javac標籤> 
該標籤用於編譯一個或一組java檔案,其屬性如下: 
srcdir表示java源程式的目錄。 
destdir表示class檔案的輸出目錄。 
includes表示別歸檔的檔案模式。 
exchudes表示被排除的檔案模式。 
debug表示包含的除錯資訊。 
optimize表示是否使用優化。 
classpath表示所使用的類路徑。 
verbose 表示提供詳細的輸出資訊。 
fileonerror表示當碰到錯誤就自動停止。 

6、<java>標籤 
該標籤用來執行編譯生成的.class檔案,其屬性如下: 
classname 表示將執行的類名。 
jar表示包含該類的JAR檔名。 
classpath所表示用到的類路徑。 
fork表示在一個新的虛擬機器中執行該類。 
failonerror表示當出現錯誤時自動停止。 
output 表示輸出檔案。 
append表示追加或者覆蓋預設檔案。 

7、<delete>標籤 
該標籤用於刪除一個檔案或一組檔案,其屬性如下: 
file表示要刪除的檔案。 
dir表示要刪除的目錄。 
includeEmptyDirs 表示指定是否要刪除空目錄,預設值是刪除。 
failonerror 表示指定當碰到錯誤是否停止,預設值是自動停止。 
verbose表示指定是否列出所刪除的檔案,預設值為不列出。 

8、<copy>標籤 
該標籤用於檔案或檔案集的拷貝,其屬性如下: 
file 表示原始檔。 
tofile 表示目標檔案。 
todir 表示目標目錄。 
overwrite 表示指定是否覆蓋目標檔案,預設值是不覆蓋。 
includeEmptyDirs 表示制定是否拷貝空目錄,預設值為拷貝。 
failonerror 表示指定如目標沒有發現是否自動停止,預設值是停止。 
verbose 表示制定是否顯示詳細資訊,預設值不顯示。 

9、<war>標籤 
該標籤用來生成一個WAR包,其屬性如下: 
destfile表示生產JAR檔名。 
dir表示被歸檔的檔案目錄。 
includes表示別歸檔的檔案模式。 
exchudes表示被排除的檔案模式。 

10、<echo>標籤 
該標籤用來在控制檯輸出資訊,其輸入如下: 
message表示輸入的內容。 

11.<exec>執行檔案:
 <exec executable="${base.dir}/email.bat" >
 </exec>

 <exec executable="cmd" dir="D:\" failonerror="true">  
    <arg line="/c del 1.bat" /> 
 </exec>


Ant的資料型別 
在構建檔案中為了標識檔案或檔案組,經常需要使用資料型別。資料型別包含在 
org.apache.tool.ant.types包中。簡單介紹構建檔案中一些常用的資料型別。 
1. argument 型別 
由Ant構建檔案呼叫的程式,可以通過<arg>元素向其傳遞命令列引數,如apply,exec和java任務均可接受巢狀<arg>元素,可以為各自的過程呼叫指定引數。以下是<arg>的所有屬性:
values 是一個命令引數,如果引數有空格,但又想將它作為單獨一個值,則使用此屬性。 
file表示一個引數的檔名。在構建檔案中,此檔名相對於當前的工作目錄。 
line表示用空格分隔的多個引數列表。 
path表示路徑。 

2.ervironment 型別 
由Ant構建檔案呼叫的外部命令或程式,<env>元素制定了哪些環境變數要傳遞給正在執行的系統命令,<env>元素可以接受以下屬性: 
file表示環境變數值得檔名。此檔名要被轉換位一個絕對路徑。 
path表示環境變數的路徑。Ant會將它轉換為一個本地約定。 
value 表示環境變數的一個直接變數。 
key 表示環境變數名。 

注意  file path 或 value只能取一個。 
3.filelist型別 
Filelist 是一個支援命名的檔案列表的資料型別,包含在一個filelist型別中的檔案不一定是存在的檔案。以下是其所有的屬性: 
dir是用於計算絕對檔名的目錄。 
files 是用逗號分隔的檔名列表。 
refid 是對某處定義的一個<filelist>的引用。 

注意  dir 和 files 都是必要的,除非指定了refid(這種情況下,dir和files都不允許使用)。 
4.fileset型別 
Fileset 資料型別定義了一組檔案,並通常表示為<fileset>元素。不過,許多ant任務構建成了隱式的fileset,這說明他們支援所有的fileset屬性和巢狀元素。以下為fileset 的屬性列表。
dir表示fileset 的基目錄。 
casesensitive的值如果為false,那麼匹配檔名時,fileset不是區分大小寫的,其預設值為true. 
defaultexcludes 用來確定是否使用預設的排除模式,預設為true。 
excludes 是用逗號分隔的需要派出的檔案模式列表。 
excludesfile 表示每行包含一個排除模式的檔案的檔名。 
includes 是用逗號分隔的,需要包含的檔案模式列表。 
includesfile 表示每行包括一個包含模式的檔名。 

5.patternset 型別 Fileset 是對檔案的分組,而patternset是對模式的分組,他們是緊密相關的概念。 
<patternset>支援4個屬性:includes excludex includexfile 和 excludesfile,與fileset相 
同。Patternset 還允許以下巢狀元素:include,exclude,includefile 和 excludesfile. 

6.filterset 型別 
Filterset定義了一組過濾器,這些過濾器將在檔案移動或複製時完成檔案的文字替換。 
主要屬性如下: 
begintoken 表示巢狀過濾器所搜尋的記號,這是標識其開始的字串。 
endtoken表示巢狀過濾器所搜尋的記號這是標識其結束的字串。 
id是過濾器的唯一標誌符。 
refid是對構建檔案中某處定義一個過濾器的引用。 

7.Path型別Path元素用來表示一個類路徑,不過它還可以用於表示其他的路徑。在用作多個屬性時,路徑中的各項用分號或冒號隔開。在構建的時候,此分隔符將代替當前平臺中所有的路徑分隔符,其擁有的屬性如下:
location 表示一個檔案或目錄。Ant在內部將此擴充套件為一個絕對路徑。 
refid 是對當前構建檔案中某處定義的一個path的引用。 
path表示一個檔案或路徑名列表。 

8.mapper型別Mapper型別定義了一組輸入檔案和一組輸出檔案間的關係,其屬性如下: 
classname 表示實現mapper類的類名。當內建mapper不滿足要求時,用於建立定製mapper. 
classpath表示查詢一個定製mapper時所用的型別路徑。 
classpathref是對某處定義的一個類路徑的引用。 
from屬性的含義取決於所用的mapper. 
to屬性的含義取決於所用的mapper. 
type屬性的取值為identity,flatten glob merge  regexp  其中之一,它定義了要是用的內建mapper的型別。 




ANT語法 

ant(another nice tool) 主要用來編譯、執行、測試java程式碼。此外還可以收發郵件、執行sql以及打jar包和war包…… 
下載ant。ant有兩個版本,二進位制版本和原始碼版本。 
要編譯和使用ant,你必須要有一個相容jaxp的xml解析器。 

使用不同的xml解析器應該怎麼辦? 
二進位制版本中自己帶有了最新的apache xerces2 xml解析器。如果你想用不同的相容jaxp的解析器,你可以移去ant庫目錄下的xercesimpl.jar和xml-apis.jar兩個檔案。你可以要用的解析器放到ant的庫目錄下,也可以把jars檔案放到系統的類路徑中。

1.配置 
在環境變數中先配置ant_home = F:\sourceCode\apache-ant-1.8.0; 
然後再path中新增%ant_home%\bin.到dos介面中輸入ant命令,如果出現build fail錯誤提示,說明設定成功。 

2.執行 
直接ant命令將開啟一個預設的構建檔案,即build.xml 
如果要呼叫我們自己的構建檔案proj.xml,則需要鍵入以下命令:ant -buildfile proj.xml 
還可以用一條命令顯示的執行多個target目標: 
ant -buildfile proj.xml clean jar 
(意思為執行proj.xml檔案中的clean和jar兩個target) ,如果不指定target命令,則執行預設的命令,預設的命令在<project name="mytest" default="complie" basedir=".">中的default屬性宣告。

3.幫助 
有些target包括有description屬性,而另一些沒有。這是因為ant會區別主目標和子目標。包含有描述資訊的為主目標,沒有描述資訊的為子目標,兩者只是表達形式上有區別,功能上是完全相同的。你可以鍵入 ant -projecthelp檢視。

4.Ant的Core Tasks 

4.1 File(Directory)類 

4.1.1 Mkdir 

建立一個目錄,如果他的父目錄不存在,也會被同時建立。 

例子: 

<mkdir dir="build/classes"/> 
說明:如果build不存在,也會被同時建立 

4.1.2 Copy 

拷貝一個(組)檔案、目錄 

例子: 

1.拷貝單個的檔案: 

<copy file="myfile.txt" tofile="mycopy.txt"/> 

2.拷貝單個的檔案到指定目錄下 

<copy file="myfile.txt" todir="../some/other/dir"/> 

3.拷貝一個目錄到另外一個目錄下 

<copy todir="../new/dir"> 

<fileset dir="src_dir"/> 

</copy> 

4.拷貝一批檔案到指定目錄下 

<copy todir="../dest/dir"> 

<fileset dir="src_dir"> 

<include name="**/*.java"/> 

<exclude name="**/Test.java"/> 

</fileset> 

</copy> 


<copy todir="../dest/dir"> 

<fileset dir="src_dir" excludes="**/*.java"/> 

</copy> 

5.拷貝一批檔案到指定目錄下,將檔名後增加。Bak字尾 

<copy todir="../backup/dir"> 

<fileset dir="src_dir"/> 

<mapper type="glob" from="*" to="*.bak"/> 

</copy> 

6.拷貝一組檔案到指定目錄下,替換其中的@標籤@內容 

<copy todir="../backup/dir"> 

<fileset dir="src_dir"/> 

<filterset> 

<filter token="TITLE" value="Foo Bar"/> 

</filterset> 

</copy> 

4.1.3 Delete 

刪除一個(組)檔案或者目錄 

例子 

1.刪除一個檔案 

<delete file="/lib/ant.jar"/> 

2.刪除指定目錄及其子目錄 

<delete dir="lib"/> 

3.刪除指定的一組檔案 

<delete> 

<fileset dir="." includes="**/*.bak"/> 

</delete> 

4.刪除指定目錄及其子目錄,包括他自己 

<delete includeEmptyDirs="true"> 

<fileset dir="build"/> 

</delete> 

4.1.4 Move 

移動或重新命名一個(組)檔案、目錄 

例子: 

1.移動或重新命名一個檔案 

<move file="file.orig" tofile="file.moved"/> 

2.移動或重新命名一個檔案到另一個資料夾下面 

<move file="file.orig" todir="dir/to/move/to"/> 

3.將一個目錄移到另外一個目錄下 

<move todir="new/dir/to/move/to"> 

<fileset dir="src/dir"/> 

</move> 

4.將一組檔案移動到另外的目錄下 

<move todir="some/new/dir"> 

<fileset dir="my/src/dir"> 

<include name="**/*.jar"/> 

<exclude name="**/ant.jar"/> 

</fileset> 

</move> 

5.移動檔案過程中增加。Bak字尾 

<move todir="my/src/dir"> 

<fileset dir="my/src/dir"> 

<exclude name="**/*.bak"/> 

</fileset> 

<mapper type="glob" from="*" to="*.bak"/> 

</move> 

4.2 Java相關 

4.2.1 Javac 

編譯java原始碼 

例子 

1.<javac srcdir="{src}" 

destdir="{build}" 

classpath="xyz.jar" 

debug="on" 

/> 

編譯{src}目錄及其子目錄下的所有。Java檔案,。Class檔案將放在{build}指定的目錄下,classpath表示需要用到的類檔案或者目錄,debug設定為on表示輸出debug資訊

2.<javac srcdir="{src}:{src2}" 

destdir="{build}" 

includes="mypackage/p1/**,mypackage/p2/**" 

excludes="mypackage/p1/testpackage/**" 

classpath="xyz.jar" 

debug="on" 

/> 

編譯{src}和{src2}目錄及其子目錄下的所有。Java檔案,但是package/p1/**,mypackage/p2/**將被編譯,而mypackage/p1/testpackage/**將不會被編譯。Class檔案將放在{build}指定的目錄下,classpath表示需要用到的類檔案或者目錄,debug設定為on表示輸出debug資訊

3.<property 
name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/> 

<javac srcdir="{src}" 

destdir="{src}" 

classpath="{classpath}" 

debug="on" 

/> 

路徑是在property中定義的 

4.2.2 java 

執行指定的java類 

例子: 

1. 
<java classname="test.Main"> 
<classpath> 
<pathelement location="dist/test.jar"/> 
<pathelement path="{java.class.path}"/> 
</classpath> 
</java> 

classname中指定要執行的類,classpath設定要使用的環境變數 

2. 
<path id="project.class.path"> 
<pathelement location="lib/"/> 
<pathelement path="{java.class.path}/"/> 
<pathelement path="{additional.path}"/> 
</path> 

<target ... > 
<rmic ...> 
<classpath refid="project.class.path"/> 
</rmic> 
</target> 

4.3打包相關 

4.3.1 jar 

將一組檔案打包 

例子: 

1.<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes"/> 

將{build}/classes下面的所有檔案打包到{dist}/lib/app.jar中 

2.<jar destfile="{dist}/lib/app.jar" 

basedir="{build}/classes" 

includes="mypackage/test/**" 

excludes="**/Test.class" 

/> 

將{build}/classes下面的所有檔案打包到{dist}/lib/app.jar中,但是包括mypackage/test/所有檔案不包括所有的Test.class

3.<jar destfile="{dist}/lib/app.jar" 

basedir="{build}/classes" 

includes="mypackage/test/**" 

excludes="**/Test.class" 

manifest="my.mf" 

/> 

manifest屬性指定自己的META-INF/MANIFEST.MF檔案,而不是由系統生成 

4.3.2 war 

對Jar的擴充套件,用於打包Web應用 

例子: 

假設我們的檔案目錄如下: 

thirdparty/libs/jdbc1.jar 

thirdparty/libs/jdbc2.jar 

build/main/com/myco/myapp/Servlet.class 

src/metadata/myapp.xml 

src/html/myapp/index.html 

src/jsp/myapp/front.jsp 

src/graphics/images/gifs/small/logo.gif 

src/graphics/images/gifs/large/logo.gif 

下面是我們的任務的內容: 

<war destfile="myapp.war" webxml="src/metadata/myapp.xml"> 

<fileset dir="src/html/myapp"/> 

<fileset dir="src/jsp/myapp"/> 

<lib dir="thirdparty/libs"> 

<exclude name="jdbc1.jar"/> 

</lib> 

<classes dir="build/main"/> 

<zipfileset dir="src/graphics/images/gifs" 

prefix="images"/> 

</war> 

完成後的結果: 

WEB-INF/web.xml 
WEB-INF/lib/jdbc2.jar 
WEB-INF/classes/com/myco/myapp/Servlet.class 
META-INF/MANIFEST.MF 
index.html 
front.jsp 
images/small/logo.gif 
images/large/logo.gif 

4.3.3 ear 

用於打包企業應用 

例子 

<ear destfile="{build.dir}/myapp.ear" appxml="{src.dir}/metadata/application.xml">
<fileset dir="{build.dir}" includes="*.jar,*.war"/> 
</ear> 

4.4時間戳 

在生成環境中使用當前時間和日期,以某種方式標記某個生成任務的輸出,以便記錄它是何時生成的,這經常是可取的。這可能涉及編輯一個檔案,以便插入一個字串來指定日期和時間,或將這個資訊合併到 JAR 或 zip 檔案的檔名中。

這種需要是通過簡單但是非常有用的 tstamp 任務來解決的。這個任務通常在某次生成過程開始時呼叫,比如在一個 init 目標中。這個任務不需要屬性,許多情況下只需 <tstamp/> 就足夠了。

tstamp 不產生任何輸出;相反,它根據當前系統時間和日期設定 Ant 屬性。下面是 tstamp 設定的一些屬性、對每個屬性的說明,以及這些屬性可被設定到的值的例子:

屬性說明例子 

DSTAMP 設定為當前日期,預設格式為yyyymmdd 20031217 

TSTAMP 設定為當前時間,預設格式為 hhmm 1603 

TODAY 設定為當前日期,帶完整的月份2003 年 12 月 17 日 

例如,在前一小節中,我們按如下方式建立了一個 JAR 檔案: 



<jar destfile="package.jar" basedir="classes"/> 

在呼叫 tstamp 任務之後,我們能夠根據日期命名該 JAR 檔案,如下所示: 

<jar destfile="package-{DSTAMP}.jar" basedir="classes"/> 

因此,如果這個任務在 2003 年 12 月 17 日呼叫,該 JAR 檔案將被命名為 package-20031217.jar。 

還可以配置 tstamp 任務來設定不同的屬性,應用一個當前時間之前或之後的時間偏移,或以不同的方式格式化該字串。所有這些都是使用一個巢狀的 format 元素來完成的,如下所示:

<tstamp> 

<format property="OFFSET_TIME" 

pattern="HH:mm:ss" 

offset="10" unit="minute"/> 

</tstamp> 

上面的清單將 OFFSET_TIME 屬性設定為距離當前時間 10 分鐘之後的小時數、分鐘數和秒數。 

用於定義格式字串的字元與 java.text.SimpleDateFormat 類所定義的那些格式字元相同 

4.5執行SQL語句 

通過jdbc執行SQL語句 

例子: 

1.<sql 

driver="org.gjt.mm.mysql.Driver" 

url="jdbc:mysql://localhost:3306/mydb" 

userid="root" 

password="root" 

src="data.sql" 

/> 

2.<sql 
driver="org.database.jdbcDriver" 
url="jdbc:database-url" 
userid="sa" 
password="pass" 
src="data.sql" 
rdbms="oracle" 
version="8.1." 


</sql> 

只有在oracle、版本是8.1的時候才執行 

4.6傳送郵件 

使用SMTP伺服器傳送郵件 

例子: 

<mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build"> 
<from address="me@myisp.com"/> 
<to address="all@xyz.com"/> 
<message>The {buildname} nightly build has completed</message> 
<fileset dir="dist"> 
<includes name="**/*.zip"/> 
</fileset> 
</mail> 

mailhost: SMTP伺服器地址 
mailport:伺服器埠 
subject:主題 
from:傳送人地址 
to:接受人地址 
message:傳送的訊息 
fileset:設定附件 

五、自定義TASK 

ANT已經內建了不少task,像copy、replace、javac等等,但是有時候還需要一些特定的任務來完成操作,比如在生成JAD檔案時,需要一個Midlet-Jar-Size的引數,得到JAR檔案的大小,但是通過內部的task無法實現,因此可以自己編寫類來實現此功能,但必須保證該類是從Task類繼承過來的。

例: 
<taskdef 
name="filesize" classname="ant.FileSizeTask" classpath="${LIB_PATH}/FileSizeTask.jar" />
<filesize file="${Base}/Demo_Build/${jarName}" property="size" /> 
   <replace dir="store" includes="${jadName}" encoding="UTF-8"> 
      <replacefilter token="@FILESIZE@" value="${size}" /> 
</replace> 
解釋:taskdef:自定義任務,name:任務名  

編寫Ant 自定義任務很簡單,Ant 能夠使用生成檔案中指定的對應屬性的值來呼叫這個方法,這個方法的名稱需要是 set 加上屬性的名稱,因此在下面的例子中,我們需要名為 setFile() 和 setTofile() 的兩個方法。

當 Ant 遇到生成檔案中的一個屬性設定時,它會尋找相關任務中具有適當名稱的方法(稱為 setter 方法)。 

生成檔案中的屬性是作為字串來指定的,因此我們的 setter 方法的引數可以是一個字串。在這樣的情況下,Ant 將在展開值所引用的任何屬性之後,使用該屬性的字串值來呼叫我們的方法。

但有時我們想把屬性的值看作是一種不同的型別。這裡的示例任務就是這種情況,其中的屬性值引用檔案系統上的檔案,而不只是引用任意的字串。可以通過將方法引數宣告為 java.io.File 型別來容易地做到這點。

Ant 將接受屬性的字串值,並把它解釋為一個檔案,然後傳遞給我們的方法。Ant 能夠對其他型別執行類似的轉換,比如 boolean 和 int 型別。但如果提供具有相同名稱但是具有不同引數的兩個方法,Ant 將使用更明確的那一個方法,因此檔案型別將優先於字串型別。

例:一個排序的task任務 

public class FileSorter extends Task { 
private File file, tofile; 
// ant在進行任務處理時會呼叫execute()方法 
     public void execute() throws BuildException { 
         System.out.println("Sorting file="+file); 
         try { 
             BufferedReader from = 
                 new BufferedReader(new FileReader(file)); 
             BufferedWriter to = 
                 new BufferedWriter(new FileWriter(tofile)); 
             List allLines = new ArrayList(); 
             // read in the input file 
             String line = from.readLine(); 
             while (line != null) { 
                 allLines.add(line); 
                 line = from.readLine(); 
             } 
             from.close(); 
             // sort the list 
             Collections.sort(allLines); 
             // write out the sorted list 
for (ListIterator i=allLines.listIterator(); i.hasNext(); ) { 
                 String s = (String)i.next(); 
                 to.write(s); to.newLine(); 
             } 
             to.close(); 
         } catch (FileNotFoundException e) { 
             throw new BuildException(e); 
         } catch (IOException e) { 
             throw new BuildException(e); 
         } 
     } 
     // file引數 
     public void setFile(File file) { 
         this.file = file; 
     } 
     // tofile引數 
     public void setTofile(File tofile) { 
         this.tofile = tofile; 
     } 


使用這個自定義任務: 

<taskdef name="filesorter"   classname=" FileSorter" classpath="filesorter"/> 
    <target name="main"> 
         <filesorter file="input.txt" tofile="output.txt"/> 
    </target> 

相關文章