如果需要在一個構件檔案中通過Ant命令去執行另一個Ant項目,或者說要執行本項目的子項目的構件檔案。這時Ant這個核心任務就派上用場了。簡單地說Ant任務的作用就相當於在命令列通過Ant命令執行構件檔案。值得注意的是Ant任務依賴於target元素,需要在某個target元素中使用,不能在target元素外獨立使用。
Ant任務還可以實作類別似Java程式間的繼承關係,不過對於這個核心任務來說只繼承property元素和reference屬性。舉個例子說,項目A中包含通過Ant任務去執行的項目B,而項目B中需要用到項目A中的屬性C,那麼可以通過設定的Ant任務中的inheritAll屬性,使得在B項目中可以使用項目A中的屬性C。從另一方面看,這也符合XP(極限)編程中的細分功能的思想,可以把大的項目切分為幾分小項目,然後通過Ant工具進行整合。
4.1.1 Ant Task的屬性及功能
Ant任務包括antfile、dir、target、output、inheritAll、inheritRefs這些屬性,具體說明如下:
(1)antfile屬性:在Ant任務中antfile屬性的作用是指定要執行的構件檔案的名稱,可包含路徑資訊。例如,在projectA中執行projectB的構件檔案。projectA的構件檔案內容如下:
<?xml version="1.0"?>
<!-- 在projectA中執行projectB的構件檔案 -->
<project name="porjectA" default="callProjectB">
<target name="callProjectB">
<echo message="In projectA calling projectB"/>
<ant antfile="subfile/projectB.xml" />
</target>
</project>
projectB存放於subfile目錄下,具體內容如下:
hamg<?xml version="1.0"?>
<project name="porjectB" default="init">
<target name="init">
<echo message="In projectB"/>
</target>
</project>
如果要通過projectA運行projectB的構件檔案,那麼可以在命令列執行:ant –buildfile projectA.xml,執行結果4.1所示。
圖4.1 通過projectA運行projectB
從執行結果得知,antfile屬性的作用相當於在Ant命令中指定-buildfile subfile/projectB. xml選項,只不過Ant任務提供了更方便的功能。如果antfile屬性沒設定,那麼Ant任務會尋找名稱為build.xml的構件檔案。當然antfile屬性也可與dir屬性結合使用,antfile指定檔案名稱,dir屬性指定檔案所在的目錄。
(2)dir屬性:在Ant任務中dir屬性的作用是用於指定構件檔案所在的目錄。相當於指定了要執行的構件檔案的basedir屬性。在預設情況下如果dir屬性沒設定,那麼會以當前執行的構件檔案的根目錄作為Ant任務的根目錄。這個屬性設定後,被執行的構件檔案的basedir屬性將取dir屬性的值。下面把targetA.xml構件檔案改寫為通過dir屬性指定目錄以實現同樣的功能,具體的構件檔案內容如下:
<?xml version="1.0"?>
<project name="porjectA" default="callProjectB">
<!-- //調用projectB.xml構件檔案 -->
<target name="callProjectB">
<echo message="In projectA calling projectB"/>
<ant antfile="projectB.xml" dir=” subfile” />
</target>
</project>
(3)target屬性:在Ant任務中target屬性的作用是指定被執行的構件檔案中所要執行的target,如果target屬性沒有設定,那麼將會執行被調用的構件檔案中的預設target(也就是project元素中指定default值)。這個屬性相當於在命令列執行時指定要執行的target的選項。例如,在projectA1中調用projectB1,並執行projectB1中的target“target2”。編寫projectA1.xml構件檔案,內容如下:
<?xml version="1.0"?>
<project name="porjectA" default="callProjectB">
<target name="callProjectB">
<echo message="In projectA calling projectB"/>
<!-- //通過ant 任務執行projectB.xml構件檔案,指定執行target2這個target -->
<ant antfile="subfile/projectB.xml" target=" target2"/>
</target>
</project>
被調用的projectB.xml構件檔案的內容如下:
<?xml version="1.0"?>
<project name="porjectB" default="init">
<target name="init">
<echo message="In projectB"/>
</target>
<target name=”target2” >
<echo message=”In projectB,execute target2” />
</target>
</project>
然後在命令列執行ant –f projectA1.xml以查看Ant任務的執行效果,執行結果4.2所示。
圖4.2 項目調用結果
在執行結果中可看出,在targetA.xml中通過Ant任務執行了targetB.xml中的target2這個target。
(4)output屬性:在Ant任務中output屬性主要用於指定Ant工具執行時的資訊輸出,可定位到控制台或定位到檔案中。當輸出資訊到檔案中時,相當於在命令列指定-logfile<file>,-l<file>選項。如果指定了dir屬性,那麼被指定的輸出檔案的位置是相對於dir屬性指定的目錄的,當然也可以通過絕對路徑指定。例如,把projectA中的輸出資訊定位到out.log檔案,構件檔案的內容如下:
<?xml version="1.0"?>
<project name="porjectA" default="callProjectB">
<target name="callProjectB">
<echo message="In projectA calling projectB"/>
<!-- //輸出資訊到out.log中 -- >
<ant antfile="subfile/projectB.xml" output="out.log"/>
</target>
</project>
(5)inheritAll屬性:在Ant任務中inheritAll屬性用於指定被調用的構件檔案的project元素中可使用當前project元素中的屬性。這個屬性類似於Java程式中類的繼承關係。預設時inheritAll屬性取值為true。
(6)inheritRefs屬性:在Ant任務中,如果設定了inheritRefs屬性為true,那麼被調用的構件檔案中的project元素可引用當前project元素中的reference(參考)任務。
Reference任務的作用是把當前的屬性複製到被調用的Ant project中使用。References任務包含兩個屬性,如下:
● refid屬性:這個屬性代表當前project中的屬性id。
● torefid屬性:用於指定在被調用的project中的引用id。
Reference的使用例子如下:
<reference refid="path1" torefid="path2"/>
<!-- // 把當前project中的path1屬性傳遞給被調用的project中使用,
在被調用project中通過path2引用這個屬性。 -- >