Ant的datetype和特性介紹(轉載)

Ant的核心功能有兩個基本概念:特性和datatypes。
1.     Datatype概述:
Ant能夠構建Java工程的主要問題域,這使得Ant成爲用於構建和打包Java應用程序的強大工具。在構建一個典型Java工程時,多數步驟都用於處理文件和路徑,例如classpath。Ant提供Datatypes來處理這兩個概念。Ant的Datatype可以認爲是類似於Java自身內建的類:data,它可以分發並提供任務。文件集和路徑以及其他幾種類型的datatype,構成了Ant構建文件的基本結構。
2.     特性概述:
Ant的特性控制機制通過參數化任何基於字符串的項目來實現構建文件的可擴展性和重用性。通過使用這些技術,用戶對構建文件的控制能力顯著增強了,例如,或許出於測試的目的,需要修改構建以使用不同版本的第三方庫,這顯得非常瑣碎:
Ant –Dstruts.jar=/home/ant/newstruts/struts.jar
在這裏,struts.jar表現爲一個Ant特性,在構建文件中,以特殊的語法來引用它:${struts.jar}。
Ant的一個關鍵特性是它的不可變性;它一旦被設置就不能發生變化,此特性保持其初始值不變所帶來的結果是,構建文件可以被設計成以指定順序載入特性文件來使得user-、project-、environment-的控制重載。
3.     通過<javac>介紹DATATYPE和特性
在構建過程中對JAVA源代碼的編譯是一項基本的任務。Ant通過<javac>任務提供JAVA編譯。該任務通過封裝很多不同的JAVA編譯器以及在通用任務定義之後與它們關聯的開關,以一個通用的界面隱藏那些類的實現細節。該任務是一個通用的界面,它基於JDK 1.1及其後續版本、Jikes和其他幾種JAVA編譯器。
選項名稱 JDK’s javac 開關選項 Ant’s <javac> 語法 
Specify where to find input source files  -sourcepath <path>  <src path="src"/> 
Override location of bootstrap class files  -bootclasspath <path>  <bootclasspath …/> 
Override location of installed extensions  -extdirs <dirs>  <extdirs …/> 
Specify where to place generated class files  -d <directory>  destdir="build" 
Specify character encoding used by source files -encoding <encoding>  encoding="…" 
Generate class files for specific VM version  -target 1.1  target="1.1" 
Enable JDK 1.4 assertions  -source 1.4  source="1.4" 

JAVA編譯過程並不僅僅指定源代碼路徑和目標路徑,下表展示了Sun的JDK的javac命令行編譯器開關和Ant的<javac>任務的對比:
(上表僅僅列出了一些選項)
Ant本身並不是一個JAVA編譯器,而只是在諸如Sun的javac之類的編譯器上做了一個包裝,你還是需要一個JAVA編譯器。在上表中介紹了幾種新的屬性(attribute)以及<javac>的幾個新的子元素。大部分屬性實際上使用的是布爾值—debug,optimize,nowarn,verbose和deprecation等。Ant在布爾值的表達上非常靈活,on,true,yes都被認爲表示true,而其他的所有值都被認爲是false。<classpath>,<src>,<bootclasspath>以及<extdirs>等元素展示了Ant最強的功能之一—路徑和文件處理功能。每個元素都與路徑有關。
下面比較一下Sun的JDK JAVA編譯器和Ant的任務之間的差別:
Sun Java Compiler:
javac -d build/classes
-classpath lib/lucene-1.2-rc3/lucene-1.2-rc3.jar;
lib/jtidy-04aug2000r7-dev/build/Tidy.jar;
C:/AntBook/jakarta-ant-1.5/lib/ant.jar;
-sourcepath src
-g
src/org/example/antbook/ant/lucene/*.java
Ant <javac> task:
<javac destdir="${build.classes.dir}"
debug="${build.debug}"
includeAntRuntime="yes"
srcdir="${src.dir}">
<classpath refid="compile.classpath"/>
<include name="**/*.java"/>
</javac>
在這個構建文件中,我們定義了路徑compile.classpath:
<path id="compile.classpath">
<pathelement location="${lucene.jar}"/>
<pathelement location="${jtidy.jar}"/>
</path>

“${…}”符號表示一個Ant特性,作用是將名字直接影射成字符串值。
子元素<classpath>使用引用(reference)來指定路徑(預先定義的路徑)。預先定義的<path>指示了要使用的JAR文件,在這裏是使用location屬性的特性指定的。
Srcdir屬性隱式定義了包含指定目錄數下所有文件的文件集,嵌套的<include>指定了將文件限定爲JAVA源文件的模式集。
4.     路徑
路徑就是經過排序的路徑元素列表。它類似於JAVA CLASSPATH,列表中的元素可以是一個由分隔符隔開的文件或者目錄,一個路徑的定義如下:
<classpath>
<pathelement location="lib/some.jar"/>
</classpath>
location屬性允許你指定單個的文件或者目錄。也可以通過另一個路徑來擴展當前路徑,使用path代替location。
<classpath>
<pathelement path="build/classes;lib/some.jar"/>
</classpath>
路徑定義中元素間的分隔符可以是分號(;)也可以是逗號(:),路徑的分隔即可以使用正斜槓,也可以使用反斜槓,無需考慮操作系統的差異,這使得它容易跨平臺。如果路徑結構中只有一個目錄或位置,則可以使用快捷的表達方式如<classpath location="lib/some.jar"/>
或者<classpath path="build/classes;lib/some.jar"/>。
路徑也可以是一個文件集合:
<classpath>
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</classpath>
需要注意的是Ant不保證<fileset>裏的內容是有序的。在路徑裏的每個元素是從頭到尾排序的,這使得所有在文件集裏的文件可以集中在一個路徑下,然而,其在文件集裏的順序是不確定的。
5.     文件集
所有的構建過程都會隱式的對一系列文件進行操作,無論是編譯,複製,刪除還是任何其他方式的操作。Ant將文件集看成是本地的datatype。難以想象會有任何實用的構建不會使用到文件集。一些任務支持路徑,而路徑隱含釐支持文件集,而其他任何一些任務則直接支持文件集。
文件集指的是同一目錄下的一系列文件。默認情況下,一個只指定了一個根目錄的文件集包含該目錄下整個目錄數中的所有文件,包含所有遞歸的子目錄下的文件。拷貝例子:
<copy todir="new_web">
<fileset dir="web"/>
</copy>
在當前狀態下,所有web目錄中的文件從web目錄被複制到new_web目錄下,這個例子可以進化成只複製指定的文件、在複製期間通過令牌替換對文件進行替換,以及對new_web目錄進行目錄層次扁平化。
例子二:在一些構建過程中,經常需要在構建文件集時包含(include)一些文件或者排除(exclude)一些文件。下面是一些典型的例子:
包含所有在lib目錄下的JAR文件(不考慮遞歸和子目錄):
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
包含所有在test目錄下以單詞”Test”結尾的.java文件:
<fileset dir="test">
<include="**/*Test.java"/>
</fileset>
Web目錄下所有非JSP頁面的文件:
<fileset dir="web">
<exclude name="**/*.jsp"/>
</fileset>
默認情況下,include和exclude中的值的大小寫是民該的,但是可以通過設置casesensitve=”false”來取消它。<include>和<exclude>元素被稱爲模式集。
6.     模式集
文件集利用Ant的另外一個核心datatype:模式集,來實現包含/排除能力。模式集是與模式相匹配的文件的彙總。模式集本身並不指向任何實際的文件,除非它被嵌套入文件集,那樣它就會以指定的目錄爲根。模式集是一種路徑匹配指定,類似於基於Unix和MS-DOS的文件匹配。*.jar用語表示所有在第一層目錄下的所有擴展名爲.jar的文件。**/*.jsp表示在整個目錄數中所有擴展名爲.jsp的文件。模式匹配的功能如下:
*指代從零到任意長度的字符。
?指代單一的字符。
**作爲目錄名,代表目錄數上從當前節點往下的所有目錄,可以是零到任意多個目錄。
以/或/結尾的模式意味着結尾是**。
<fileset>暗含有模式集,但是考慮到需要在多個文件集中重用,模式集也可以單獨指定,下表列出了<patternset>元素的可用屬性。
includes:應包含的文件模式列表,以逗號分隔,省略時包含所有文件。
excludes:應排除的文件模式列表,以逗號分隔,省略時表示不排除任何文件(除認爲默認的排除文件)。
includesfile:文件名稱;該文件的每一行被看作是包含模式。如果要指定多個要包含的文件,可以通過嵌套includesfile元素來實現。
excludesfile: 文件名稱;該文件的每一行被看作是排除模式。如果要指定多個要排除的文件,可以通過嵌套excludesfile元素來實現。

Excludes具有有限權,如果一個文件既與include模式匹配,又與exclude模式匹配,則將被排除。符合這些屬性的元素可以成爲<patternset>元素的子元素以增加它的靈活性和可控性。這些元素是:
<include>,<exclude>,<includesfile>,<excludesfile>。這些元素都有個name屬性,對於<include>和<exclude>,他們的name屬性分別指的是included和excluded模式。對於<includesfile>和<excludesfile>,它們的name屬性特性分別表示各自的文件名稱。每種元素都有if/unless屬性。這些是有條件的模式集。
例子:
在文件集中使用<patternset>元素時總是顯示指定。
<patternset>
<include name="*.jsp"/>
</patternset>
文件集默認包含有模式集。
<copy todir="new_web">
<fileset dir="web" includes="**/*.jsp"/>
</copy>
這等同於:
<copy todir="new_web">
<fileset dir="web">
<include name="**/*.jsp"/>
</fileset>
</copy>
我們僅僅定義了*.jsp,只有在web目錄下的JSP文件被複制,而其子目錄中的文件則都不會被複制。模式集可以被另外一個模式集嵌套,例如:
<patternset>
<include name="**/*.gif,**/*.jpg"/>
<patternset>
<exclude name="**/*.txt,**/*.xml"/>
</patternset>
</patternset>
嵌套的模式集並不是必須的。
7.     選擇器:
Ant1.5包含了一個精密的新特性,名爲選擇器(selector),它用來選擇包含在文件集中的文件。
Ant內建的選擇器及其說明:
<filename>:基於模式匹配文件,工作方式類似於模式集的<include>或<exclude>元素。
<depth>:基於目錄深度範圍來選擇文件。
<size>:以小於、等於、大於該指定值爲條件來選擇文件。
<date>:以最後修改時間早於、遲於或者等於指定值來選擇文件
<present>:選擇存在於其他目錄數的文件
<depend>:選擇比其他目錄下相對應的文件更新的文件
<contains>:選擇包含指定字符串的文件.
這些選擇器都可以被合併到選擇器容器內以提供分組和邏輯表達。這些容器就是<and>、<or>、<not>、<none>、<majority>。容器可以嵌套,用以表達負責的邏輯選擇結構。
例子:結合使用<not>和<present>
<copy todir="newfiles" includeemptydirs="false">
<fileset dir="web">
<not>
<present targetdir="currentfiles"/>
</not>
</fileset>
</copy>

<copy>任務複製所有隻存在於web目錄而不存在於currentfiles目錄的文件。使用<contains>選擇器,我們可以選擇只包含特定字符串的文件:
<copy todir="currentfiles" includeemptydirs="false">
<fileset dir="web">
<contains text="System"/>
</fileset>
</copy>

只有在web目錄下,且文件中包含文本”System”文件才被複制到currentfiles目錄。默認情況下<contains>對大小寫敏感,可以通過casesensitive=”no”來進行修改。

DATATYPE元素明明
Ant在其API工公開了模式集、文件集和路徑以及一些其他的datatype。框架並不強制要求給這些datatype元素命名,任務可以無需顯示指定<fileset>就可以支持這些datatype。
<javac>任務就是一個隱含包含文件集的例子。它通過:
includes,excludes,includesfile,excludesfile屬性以及:
<include>,<exclude>,<includesfile>,<excludesfile>元素來實現。請注意<fileset>有一個強制屬性dir屬性,但是<javac>是通過srcdir屬性來指定的,這樣做的目的是區分源目錄和目標目錄。
<javac>任務也可以用來例示允許將路徑做爲嵌套元素的任務,可以指定不同類型的路徑(<src><classpath><bootclasspath><extdirs>);並且還可以通過任意方式結合。例如可以使用兩個<src>標記來編譯兩個目錄數下的源代碼到一個輸出目錄:
<javac destdir="build/classes">
<src path="src"/>
<src path="test/junit"/>
</javac>

8.     過濾集FilterSet
在構建過程中,基於動態構建信息或狀態對文件進行簡單文本替換的情況是很常見的,兩個最主要支持過濾集功能的任務是<copy>和<move>。在下列兩種情況下使用帶有過濾的複製會帶來便利:
將構建與包含當前日期或版本信息的文件相綁定,例如編制文檔。
      對配製文件進行有選擇的註釋。
在將源文件拷貝或者移動到目錄文件時將進行一個過濾操作來替換源文件中帶標記的文本。對於 經過過濾的拷貝操作,源文件不被改變。標記用兩端被標記分隔符隔開的文本進行定義。默認的分隔符是”@”,但是可以使用<filter-set>裏的begintoken和endtoken屬性進行修改。
例子:在構建文件時在文件中插入時間戳
       將生成文件中日期和時間戳替換爲構建實際運行的日期和時間,而保持原文件不變:
<html>
<head><title>Ant Book</title></head>
<body>
System build time: @DATE@ @ @TIME@
</body>
</html>

這裏的@DATA@和@TIME@在複製過程中將被替換:
<tstamp/>
<copy todir="new_web" overwrite="true">
<fileset dir="web" includes="**/*.jsp"/>
<filterset>
<filter token="DATE" value="${DSTAMP}"/>
<filter token="TIME" value="${TSTAMP}"/>
</filterset>
</copy>

<tstamp>任務創建了Ant的DSTAMP和TSTAMP特性。${DSTAMP}和${TSTAMP}的值分別是日期和時間戳。<copy>任務句有依賴性檢查,因此它不會對修改時間戳早於目標文件的源文件進行復制。因爲經過過濾的copy操作總會替換目標文件,因此我們設置overwrite=”true”來關閉依賴性檢查,在對於JSP文件的應用經過過濾的copy操作結果如下:
<html>
<head><title>Ant Book</title></head>
<body>
System build time: 20020207 @ 1501
</body>
</html>
注意:不要讀二進制文件進行過濾操作。

9.     過濾鏈和過濾閱讀器
過濾閱讀器是一個簡單的過濾器,它輸入文件,並在輸出之前對其文字進行移除和修改。過濾鏈是一組經過排序的一個或者多個過濾閱讀器。Ant內置一些過濾閱讀器:
<classconstants>:爲在類文件中發現的基本的和字符串datatype常量生成”name=value”行
<expandproperties>:替換Ant特性值
<headfilter>:取出指定數量的前幾行
<linecontains>:只允許包含指定字符串的行通過
<linecontainsregexp>:只允許符合正則表達式的行通過
<prefixlines>:所有行都有預先定義的前綴
<replacetokens>:如同過濾集那樣,執行標記替換
<stripjavacomments>:移除JAVA風格的註釋
<striplinebreaks>:移除換行符,默認爲”/r”和”/n”,但是要移除的字符也可以指定
<striplinecomments>:移除以指定的字符集合開頭的行
<tabstospaces>:將tab符號替換爲指定數量的空格
<tailfilter>:取出指定數量的最後幾行
有四個任務支持過濾鏈:<copy>、<move>、<loadfile>、<loadproperties>。將註釋從JAVA特性文件中剝離,或者去掉注視裝載而將註釋留在開發者文件裏,是<copy>中使用<stripjavacomments>過濾閱讀器的一個直接原因。
屬性文件爲:
# <Internal developer info>
config.parameter=47

將其複製到build目錄下:
<copy file="config.properties" todir="build">
<filterchain>
<striplinecomments>
<comment value="#"/>
</striplinecomments>
</filterchain>
</copy>

則相應的文件build/confi.properties將不會再有註釋行,而只有內容:
config.parameter=47.
還可以通過使用<loadproperties>任務可以從java代碼中取出數值作爲參數傳入Ant。爲定義常量取得一個接口:
package org.example.antbook;
public interface Constants {
public static final String VERSION ="1.7";
}
將代碼編譯到build目錄下。在<loadproperties>任務中使用<classcontants>和<prefixlines>過濾閱讀器,就可以給予Ant獲取VERSION常量的途徑:
<loadproperties srcfile="build/org/example/antbook/Constants.class">
<filterchain>
<classconstants/>
<prefixlines prefix="Constants."/>
</filterchain>
</loadproperties>
<echo>Constants.VERSION = ${Constants.VERSION}</echo>
     輸出結果如下:Constants.VERSION = 1.7
      注意:<classconstants/>直接操作於.class文件,而不是.java文件。

10.     映射器Mapper
Ant的mapper datatype用於將一批文件與另外的文件進行匹配。下表中列出了幾種Ant內置的映射器,映射器由<copy>、<uptodate>、<move>和<apply>以及其他幾種任務調用。視映射器類型而定,from和to屬性可能是必需的。

映射器類型。映射器用於<copy>任務,可以減少目錄的層次,也可以根據文檔的修改日期檢查全部文件並映射到一個文檔中

identity:目標文件和源文件名稱相同
flatten:目標文件和源文件名稱相同,且目標文件名中去除所有目錄路徑
merge:全部源文件映射到以to屬性指定的單一目標文件。
glob:在from模式中用一個星號指代的部分由to模式中的內容替代,只對匹配from模式的文件進行操作。
package:Glob映射器的子類,它與glob功能類似,但與glob不同的是它會將目錄分隔符替換爲點字符,這樣可以將一個具有目錄層次結構的包目錄的文件映射成扁平目錄結構,並且可以通過文件名保留其包結構。
regexp:from和to模式都定義爲正則表達式,只對匹配from表達式的文件進行操作。

Identity映射器:目標文件和源文件名稱相同,to和from屬性在該映射器裏都不起作用:<mapper type=”identity” />。<copy>任務使用與不使用該映射器是一樣的,默認就已經使用該映射器。

Flatten映射器:要將所有JSP頁面從web目錄結構複製到一個單一扁平的目錄下時,應該以下列方式使用flatten映射器:

<copy todir="new_web">
<fileset dir="web" includes="**/*.jsp"/>
<mapper type="flatten"/>
</copy>
注意:如果有多個文件擁有相同的文件名,不考慮到目錄,將只有一個文件被複制到該目錄,並且不能確定是哪一個。

Merge映射器:目標文件名由to屬性指定,全部源文件映射到這個單一的目標文件:
<mapper type=”merge” to=”archive.zip” />
當很多文件映射到一個目標文件時,merge影射器與<uptodate>任務同時使用。例如,很多文件被打包成單一的ZIP文件,如果該ZIP文件包括所有日期最新的源文件,則應該設置一個特性:
<uptodate property="zip.notRequired">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="merge" to="${dist.dir}/src.zip"/>
</uptodate>

Glob映射器:同時使用to和from屬性,兩個屬性都可以使用星號模式。匹配from屬性規定模式的文字被替換成to模式。
<mapper type=”glob” from=”*.jsp” to=”*.jsp.bak” />
如下冽所示,glob映射將對於將文件複製到新文件名的方式製作備份文件非常有用。不能匹配from模式的文件將被忽略。
<copy todir="new_web">
<fileset dir="web" includes="**/*.jsp"/>
<mapper type="glob" from="*.jsp" to="*.jsp.bak" />
</copy>
全部JSP文件從web目錄被拷貝到new_web目錄中,並保留了目錄層次結構,但是所有的源.jsp在new_web目錄下都被改名成了.jsp.bak。

Package映射器:是Glob映射器的一種特殊形式,它將與from模式匹配的片段轉換成to模式規定的以”.”分隔的包字符串。轉換過程簡單的將目錄分隔符斜槓或者反斜槓變成點。其結果是一個扁平的目錄結構,其中包含了設想中的Java文件,這些java文件需要與嵌入在文件名中的完全合格的類名稱的數據文件相匹配。更準確的說,該映射器主要用於由<junit>任務生成的數據。

在運行測試用例中,<junit>生成的數據文件被寫到一個單一的目錄下,並命名爲TEST-<完全限定的類名>.xml。爲了證實該測試用例的數據文件不早於其相應的JAVA文件,我們在<uptodate>任務中加入package映射器:
<property name="results.dir" location="test_results"/>
<uptodate property="tests.uptodate">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="package"
from="*.java" to="${results.dir}/TEST-*.xml" />
</uptodate>
11.     特性Property
特性由於其名稱和值的關係,可以粗略的看成是變量。
Ant內建特性:
ant.file:構建文件的絕對路徑
ant.home:用於Ant執行的根路徑
ant.java.version:Ant檢測到的JVM的版本
ant.project.name:當前執行的工程的名稱;可由<project>中的name屬性設置
ant.version:Ant版本號
basedir:工程基目錄的絕對路徑,由<project>中的basedir特性設置

Ant特性通常依賴於其使用時的上下文環境,由構建文件中的${property.name}來表示。要檢查上述特性,可以使用任務<echo>:
<target name="echo">
<echo message="ant.file = ${ant.file}"/>
<echo message="ant.home = ${ant.home}"/>
<echo message="ant.java.version = ${ant.java.version}"/>
<echo message="ant.version = ${ant.version}"/>
<echo message="basedir = ${basedir}"/>
</target>
所有JAVA虛擬機系統的特性都會隱式的成爲ANT特性,並允許對一些重要信息諸如用戶的主目錄以及當前的用戶名稱都可以按需要進行修改。JVM的特性在不同的平臺上是不同的,但他們中有很多是值得你信任的。

1.       通過<property>任務設置特性
該任務允許在構建文件中自定義特性,最常用的特性是以下幾種:
Name/Value對
從特性文件中載入特性集合
載入環境變量
<property name=”build.debug” value=”on” />
可以使用
<javac srcdir=”src” debug=”${build.debug}” />

在工程的根目錄創建一個名爲build.properties的文件,這也是構建文件所在的目錄。文件包含以下內容:
build.debug=off
使用<property>任務中的一個變量:
<property file=”build.properties” />
特性文件中的特性值也可以是對特性的引用,例如
build.dir=build
output.dir=${build.dir}/output

注意:引用相對路徑的特性最好使用location變量來設置。
因爲特性是不可以改變的,因此通過文件載入特性時可以給出它們的名稱前增加前綴。例如,可以使用前綴prefix=”temp”,這樣創建好的特性將變爲temp.build.dir和temp.output.dir。當我們需要同時從兩個特性文件中載入同名特性時不至於引起歧義。

特性測試:
<target name="override">
<property file="build.properties"/>
<property name="build.debug" value="on"/>
<echo message="debugging is turned ${build.debug}"/>
</target>
特性值一旦設置,就不能修改,所以結果爲
[echo] debugging is turned off.

另一個重要的<property>變量允許將環境變量作爲特性。爲了避免環境變量與已有的Ant特性衝突,環境變量在載入時被加上前綴,例如
<property environment=”env” />
所有的環境變量被載入爲Ant的內部特性時都被加上env.前綴。

特性的一個關鍵用途是抽象化系統文件系統路徑,它使得任務只需處理特性名即可,而具體值的確立則在別處定義或者生成(多數情況下)。不使用絕對路徑定義構建也很容易。只需將路徑定義爲項目的基路徑下的相對路徑。
<property>任務還有另一個變量可以將指定路徑設置爲絕對路徑:
<property name=”build.dir” location=”build” />
build.dir特性的值並不簡單的賦爲字符串build,當前工程的基路徑(通常是build.xml所在的路徑)會被用作相關引用的根目錄,而完整的路徑將被解析爲/home/erik/AntBook/Sections/Learning/datatypes/build。建議使用location功能將邏輯的相對路徑鎖定到絕對路徑,並在對文件和目錄操作時使用直接引用。
2.       <property>任務怎樣區別與其他的任務?
<property>任務的特殊之處在於它具有特殊的權限,可以在<target>之外執行:它可以獨立的成爲<project>的直接子元素。所有位於target之外的任務都將在target運行之前被計算,因此,建議將所有這些<project>中的”非target聲明”放在target聲明之前,以避免混亂。
3.       檢查資源的可用性:<available>
當指定資源存在時,<available>任務會設置特性值,它能夠檢查以下內容:
classpath下的某個類是否存在
某個文件或者目錄是否存在
某個JVM系統資源是否存在
檢查classpath下某個類是否存在:
<available property="xdoclet.present"
classname="xdoclet.doc.DocumentDocletTask"
classpath="${xdoclet.jar}"/>
<echo message="xdoclet.present = ${xdoclet.present}"/>
如果類xdoclet.doc.DocumentDocletTask被發現,xdoclet.present就設爲true.否則,就沒有值。所以結果是xdoclet.present=true或者
xdoclet.present=${xdoclet.present}
(一個未定義的屬性不能被解析,直接按照字面意思來使用)
檢查某個文件或者目錄是否存在:
如果存在,則設置特性值。
<available property="lib.properties.present"
file="${lib.dir}/lib.properties"
type="file"/>
檢查JVM系統資源是否存在:
最後一項有效性檢查是資源,即在classpath下可查找的任意文件。通常用語檢查配製文件的有效性:
<available property=”resource.exists”
resource=”org/example/etc/struts.xml” />

4.       忽略不必要的步驟:<uptodate>以節省時間
該任務以確認目標文件與源文件相比是否是最新的。多數任務都會在內部自動檢查(<javac> etc.)。但是有一些需要你自己去實施檢查,例如Junit的一些任務。
<uptodate property="tests.unnecessary">
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="glob"
from="*.java" to="${build.dir}/classes/*.class" />
</uptodate>
在本例中,如果源目錄數中的每個模塊都不新於對應的.class文件,則特性tests.unnecessary的值就設爲true。
5.       用<condition>測試條件
<condition>通過邏輯運算符<and>、<or>和<not>來提供特性設置的威力。
<available>:Exactly the same semantics and syntax as the <available> task, except property and value are ignored. Evaluates to true if the resource is available.
<uptodate> :xactly the same semantics and syntax as the <uptodate> task, except property and value are ignored. Evaluates to true if file(s) are up-to-date.
<os>:Evaluates to true if the O/S family (mac, windows, dos, netware, os/2, or unix), name, architecture, and version match.
<equals>:Evaluates to true if both properties have the same value.
<isset>:Evaluates to true if the property exists.
<checksum>:Uses the same syntax as the <checksum> task, evaluating to true if the checksum of the file(s) match.
<http>:Checks for a status code < 500 from a URL.
<socket>:Checks for a socket listener on a specified port and host.
<filesmatch>:Byte-for-byte file comparison between two files.
<contains>:Tests whether one string contains another, optionally case-sensitive.
<istrue>:True if the value is on, true, or yes.
<isfalse>:The negation of <istrue>.
例子:
<condition property="tests.unnecessary">
<and>
<uptodate>
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="glob" from="*.java"
to="${build.dir}/classes/*.class" />
</uptodate>
<uptodate>
<srcfiles dir="test" includes="**/*.java"/>
<mapper type="glob" from="*.java"
to="${test.dir}/*.class" />
</uptodate>
<uptodate>
<srcfiles dir="test" excludes="**/*.java"/>
<mapper type="glob" from="*" to="${test.dir}/*" />
</uptodate>
</and>
</condition>
如果與測試有關的文件都是最新的,則tests.unnecessary被設置爲true。
6.       在命令行中設置特性
通過命令行的-D和-propertyfile選項可以設置特性或者從特性文件中載入特性。
7.       用<tstamp>創建構建的時間戳
<tstamp/>
基於當前日期/時間自動設置三個特性
DSTAMP:”yyyymmdd”
TSTAMP:”hhmm”
TODAY:”month day year”
     
<tstamp>可以使用嵌套元素<format>來指定特定規範的時間戳,例如
<tstamp>
<format property="buildtime"
pattern="yyyy-MM-dd'T'HH:mm:ss" />
</tstamp>
<echo message="buildtime = ${buildtime}"/>
還可以爲時間戳特性增加前綴:
<tstamp prefix=”start” />
以上代碼設置了三個特性start.DSTAMP,start.TSTAMP,start.TODAY。

8.       從xml文件中載入特性
下面例子被設計成可以爲不同的客戶提供個性化的操作,每個客戶響應的都有一個特性信息的XML文件,諸如名字或者其他一些特定運行細節:
<xmlproperty>讀取XML文件,照裏面的元素和特性的原樣創建特性。
構建文件可以很容易的使用這些信息:
<project name="xmlprops" default="main">
<target name="main">
<property name="customer" value="acme"/>
<xmlproperty file="${customer}.xml"/>
<echo message="Building for ${customer(name)}..."/>
<echo level="verbose">
classname = ${customer.settings.impl}
</echo>
</target>
</project>
在開始部分,我們使用customer特性定義客戶的暱稱,其默認值爲acme,構建在verbose模式的輸出結果爲:
main:
[echo] Building for Acme, Inc....
[echo] classname = org.example.antbook.acme.SomeClass
這間接允許我們在構建時使用任意的客戶名來重載customer的值,例如:
ant –Dcustomer=joes_garage
<xmlproperty>具有屬性prefix決定特性的前綴,validate=”true”時進行有效性檢查,默認不檢查! 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章