初步使用 編寫簡單的build.xml(默認的,Ant會自動的在當前目錄下去尋找這個文件,如果找的就去構建,如果找不到就會提示:build.xml does not exist!
<?xml version="1.0" encoding="utf-8"?>
<project default="init">
<target name="init">
<mkdir dir="helloworld" />
</target>
</project>
Ant沒有定義自己的自定義語法;相反,它的生成文件是使用XML編寫的。存在Ant能夠理解的預定義XML元素,而且還可以定義新的元素來擴展Ant的功能。每個生成文件由單個project元素組成,該元素又包含一個或多個target元素。一個目標(target)是生成過程中已定義的一個步驟,它執行任意數量的操作,比如編譯一組源文件。並且這些操作本身是由其他專用的任務標籤執行的
頂級的project元素需要包含一個default屬性,如果在Ant被調用時沒有指定目標,這個屬性將指定要執行的目標。然後需要使用target元素來定義該目標本身。
Ant中的屬性類似編程語言中的變量,它們都具有名稱和值。然而與通常的變量不同,一經設置,Ant中是屬性就不可更改;它們是不可變的,就像Java語言中的String對象。這起初看起來似乎很有限制性,但這樣是爲了遵循Ant的簡單原則:畢竟,它是一個生成工具,而非一種編程語言。如果嘗試給某個現有的屬性賦予一個新的值,這不會看作是一個錯誤,但是該屬性仍然會保留其現有的值
定義與使用屬性
<property name=”metal” value=”beryllium”/>
爲了在生成文件的其他部分引用這個屬性,使用以下語法:
${metal}
例如,爲了使用這樣一個值,它是另一個屬性的值的組成部分,將標籤寫成下面這樣
<property name=”metal-database” value=”${metal}.db”/>
屬性經常用於引用文件系統上的文件或目錄,但是對於使用不同路徑分隔符(例如,/與|的平臺來說,這樣可能再跨越不同平臺時導致問題。Ant的location屬性專門設計用於以平臺無關的方式包含文件系統路徑。像下面這樣使用location替代value:
<property name=”database-file” location=”archive/database/${metal}.db”/>
用於location屬性的路徑分隔字符將被轉換爲當前平臺的正確格式;而且由於文件名是相對的,它被認爲是相對於項目的基目錄。我們同樣可以容易地寫爲下面這樣:
<property name=”database-file” location=”archive\database\${metal}.db”/>
這個標籤的兩個版本都會在不同的平臺具有相同的行爲
定義依賴關係:
生成一個項目一般需要許多步驟--例如首先要編譯源代碼,然後將它打包爲Java歸檔文件(Java Archive File,JAR)。這其中許多步驟都具有清楚定義的順序--例如,在編譯器從源代碼生成類文件之前,您不能打包類文件。與順序指定target所不同的是,Ant採用一種更靈活的方法來定義依賴關係。每個目標的定義依據的是它能夠執行之前必須完成的其他所有目標。這是使用target元素的depends屬性來實現的
例如:
<target name=”init”/>
<target name=”preprocess” depends=”init”/>
<target name=”compile” depends=”init,preprocess”/>
<target name=”package” depends=”compile”/>
這種方法允許您執行項目任何階段的生成過程;Ant會首先執行已定義的先決階段。在上面的例子中,如果讓Ant完成complie步驟,它將判斷出需要首先執行init和和preprocess這兩個目標。Init目標不依賴其他任何目標,因此它將首先被執行。然後Ant檢查preprogress target,發現它依賴init目標;由於已經執行後者,Ant不會再次執行它,因此開始執行preprocess目標。最後可以執行compile任務本身。
注意目標出現在生成文件中的順序並不重要:執行順序是由depends屬性唯一確定的。
<?xml version="1.0" encoding="utf-8"?>
<project name="initProject" default="package" basedir=".">
<property name="hello" value="hello123"/>
<property name="welcome" value="welcome123"/>
<target name="init">
</target>
<target name="preprocess" depends="init">
<mkdir dir="${hello}"/>
<mkdir dir="${welcome}"/>
</target>
<target name="compile" depends="init,preprocess"/>
<target name="package" depends="compile"/>
</project>
-D<property>=<value> use value for given property
<?xml version="1.0" encoding="utf-8"?>
<project name="initProject" default="package" basedir=".">
<property name="compile" value="complile"/>
<property name="dist" value="dist"/>
<target name="init">
</target>
<!--打包-->
<target name="preprocess" depends="init">
<mkdir dir="${compile}"/>
<mkdir dir="${dist}"/>
</target>
<!--編譯-->
<target name="compile" depends="init,preprocess">
<javac srcdir="." destdir="${compile}"></javac>
</target>
<!--打包-->
<target name="package" depends="compile">
<jar destfile="${dist}/package.jar" basedir="${compile}">
<!--生成manifest文件-->
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="test"/>
</manifest>
</jar>
</target>
</project>
- Javac任務的一個重要的特點在於,它僅編譯那些它認爲需要編譯的源文件。如果某個類文件已經存在,並且對應的源文件自從該類文件生成以來還沒改變過,那麼該源文件就不會被重新編譯。Javac任務的輸出顯示了實際被編譯的源文件的數目。這種行爲刻畫了Ant的許多任務的特點:如果某個任務能夠確定所請求的操作不需要執行,那麼該操作就會被跳過。創建JAR文件在編譯Java源文件之後,結果類文件通常被打包到一個JAR文件中,這個文件類似zip歸檔文件,它可以指定該JAR文件的屬性下面是Ant中jar任務的一個簡單使用例子:<jar destfile=”package.jar” basedir=”classes”/>這將創建一個名爲package.jar的jar文件,並把classes目錄中所有文件添加到其中(JARwe文件能夠包含任意類型的文件,而不只是類文件)。此處沒有指定清單文件,因此Ant將提供一個基本的清單文件Mainifest屬性允許指定一個用作JAR文件的清單的文件。清單文件的內容還可以使用mainifest任務在生成文件中指定。這個任務能夠向文件系統寫入一個清單文件,或者能夠實際嵌套在Jar之內,以便一次性地創建清單文件和JAR文件。-在生成環境中使用當前時間和日期,以某種方式標記某個生成任務的輸出,以便記錄它是何時生成的,這經常是可取的。這可能涉及編輯一個文件,以便插入一個字符串來指定日期和時間,或將這個信息合併到JAR或者zip文件的文件名中-這種需要是通過簡單但是非常有用的tstamp任務來解決的。這個任務通常在某次生成過程開始時調用,比如在一個init目標中。這個任務不需要屬性,許多情況下只需要<tstamp/>就足夠了在調用tstamp任務之後,我們能夠根據日期命名該JAR文件,如下所示:<tstamp><format property="TODAY" pattern="yyyyMMdd" locale="cn" /></tstamp><jar destfile=”package-${DSTAMP}.jar” basedir=”classes”/> // output package-20150411.jar基本操作創建和刪除目錄-最基本的文件系統操作之一就是創建目錄或文件夾。做這項工作的任務名稱爲mkdir-<mkdir dir=”archive/metals/zinc”/>-mkdir任務的另一個有用的特性是它的如下能力:在父目錄還不存在時創建它們-如果目標目錄已經存在,mkdir任務不會發出錯誤消息,而只是假設它的工作已經完成,從而什麼也不做刪除目錄-<delete dir=”archive/metals/zinc”/>-這將刪除指定的目錄連同它包含的所有文件以及子目錄。使用file屬性而不是dir屬性可以指定要刪除的單個文件複製移動文件目錄<copy file=”src/Test.java” tofile=”src/TestCopy.java”/>還可以使用move來執行重命名操作而不是拷貝文件<move file=”src/Test.java” tofile=”src/TestCopy.java”/>另一個常用的文件系統操作是將文件複製或在移動到另一個目錄<copy file=”src/Test.java” todir=”archive”/><move file=”src/Test.java” tofile=”archive”/>默認情況下,Ant僅輸出它執行的移動和複製操作的摘要,包括諸如已移動或複製的文件的數量等信息。如果想看到更詳細的信息,包括涉及的文件名稱等,可以將verbose屬性設置爲true