Ant 學習筆記

http://ant.apache.org/  下載zip包 ant,解壓到 某個盤,比如D:\apache-ant-1.9.4配置環境變量  ,bin加入path,測試是否成功,則表示配置成功。
初步使用 編寫簡單的build.xml(默認的,Ant會自動的在當前目錄下去尋找這個文件,如果找的就去構建,如果找不到就會提示:build.xml does not exist!
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <project default="init">
  3. <target name="init">
  4. <mkdir dir="helloworld" />
  5. </target>
  6. </project>
命令行 運行ant ,然後就創建helloworld文件夾 

  1. Ant沒有定義自己的自定義語法;相反,它的生成文件是使用XML編寫的。存在Ant能夠理解的預定義XML元素,而且還可以定義新的元素來擴展Ant的功能。每個生成文件由單個project元素組成,該元素又包含一個或多個target元素。一個目標(target)是生成過程中已定義的一個步驟,它執行任意數量的操作,比如編譯一組源文件。並且這些操作本身是由其他專用的任務標籤執行的
  2. 頂級的project元素需要包含一個default屬性,如果在Ant被調用時沒有指定目標,這個屬性將指定要執行的目標。然後需要使用target元素來定義該目標本身。
  3. Ant中的屬性類似編程語言中的變量,它們都具有名稱和值。然而與通常的變量不同,一經設置,Ant中是屬性就不可更改;它們是不可變的,就像Java語言中的String對象。這起初看起來似乎很有限制性,但這樣是爲了遵循Ant的簡單原則:畢竟,它是一個生成工具,而非一種編程語言。如果嘗試給某個現有的屬性賦予一個新的值,這不會看作是一個錯誤,但是該屬性仍然會保留其現有的值
  4. 定義與使用屬性
  5. <property name=”metal” value=”beryllium”/>
  6. 爲了在生成文件的其他部分引用這個屬性,使用以下語法:
  7. ${metal}
  8. 例如,爲了使用這樣一個值,它是另一個屬性的值的組成部分,將標籤寫成下面這樣
  9. <property name=”metal-database” value=”${metal}.db”/>
  10. 屬性經常用於引用文件系統上的文件或目錄,但是對於使用不同路徑分隔符(例如,/與|的平臺來說,這樣可能再跨越不同平臺時導致問題。Ant的location屬性專門設計用於以平臺無關的方式包含文件系統路徑。像下面這樣使用location替代value:
  11. <property name=”database-file” location=”archive/database/${metal}.db”/>
  12. 用於location屬性的路徑分隔字符將被轉換爲當前平臺的正確格式;而且由於文件名是相對的,它被認爲是相對於項目的基目錄。我們同樣可以容易地寫爲下面這樣:
  13. <property name=”database-file” location=”archive\database\${metal}.db”/>
  14. 這個標籤的兩個版本都會在不同的平臺具有相同的行爲
定義依賴關係:

生成一個項目一般需要許多步驟--例如首先要編譯源代碼,然後將它打包爲Java歸檔文件(Java Archive FileJAR)。這其中許多步驟都具有清楚定義的順序--例如,在編譯器從源代碼生成類文件之前,您不能打包類文件。與順序指定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屬性唯一確定的。


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <project name="initProject" default="package" basedir=".">
  3. <property name="hello" value="hello123"/>
  4. <property name="welcome" value="welcome123"/>
  5. <target name="init">
  6. </target>
  7. <target name="preprocess" depends="init">
  8. <mkdir dir="${hello}"/>
  9. <mkdir dir="${welcome}"/>
  10. </target>
  11. <target name="compile" depends="init,preprocess"/>
  12. <target name="package" depends="compile"/>
  13. </project>
例子,可以生成兩個文件夾
默認情況下,Ant尋找一個名爲build.xml的文件。當然,也可以使用其他名稱的生成文件,在那樣的情況下,你需要對Ant使用: ant -f test.xml  (-f 是-file簡寫形式)
-D<property>=<value>   use value for given property  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <project name="initProject" default="package" basedir=".">
  3. <property name="compile" value="complile"/>
  4. <property name="dist" value="dist"/>
  5. <target name="init">
  6. </target>
  7. <!--打包-->
  8. <target name="preprocess" depends="init">
  9. <mkdir dir="${compile}"/>
  10. <mkdir dir="${dist}"/>
  11. </target>
  12. <!--編譯-->
  13. <target name="compile" depends="init,preprocess">
  14. <javac srcdir="." destdir="${compile}"></javac>
  15. </target>
  16. <!--打包-->
  17. <target name="package" depends="compile">
  18. <jar destfile="${dist}/package.jar" basedir="${compile}">
  19. <!--生成manifest文件-->
  20. <manifest>
  21. <attribute name="Built-By" value="${user.name}"/>
  22. <attribute name="Main-Class" value="test"/>
  23. </manifest>
  24. </jar>
  25. </target>
  26. </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











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