本文爲翻譯官方文檔而來,不當之處請指正。html
Ant的構建文件寫在xml文件當中,每個構建文件包含一個project和至少一個(默認的)target。Targets包含task elements。每個task element都有一個id屬性,能夠提供給此值的引用。固然id屬性是惟一的。java
一個project有三個屬性web
屬性 | 描述 | 必須的 |
---|---|---|
name | 項目名稱 | 否 |
default | 若是沒有任何target的話,須要這個默認的target | 否,自從螞蟻1.6.0,每一個項目包括一個隱含的目標,包含全部的頂級任務和/或類型。這一目標將永遠做爲項目的初始化部分執行,即便當螞蟻運行時有projecthelp選項。 |
basedir | 用於指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件文件的父目錄做爲基準目錄 | 否 |
<project name="XXX" default="xxxx" basedir="."> … </project>
屬性 | 描述 | 必須的 |
---|---|---|
name | Target名 | 是 |
depends | 依賴 | 否 |
if | 某property必須設置了才能夠運行這個target或者property擴展屬性評估是true | 否 |
unless | 某property必須沒有設置才能夠運行這個target或者property擴展屬性評估是false | 否 |
description | Target功能的描述 | 否 |
extensionOf | 當這個target添加到extension-point的依賴列表中,1.8.0開始 | 否 |
onMissingExtensionPoint | 若是這個target視圖擴展丟失的extension-point該怎麼辦 | 否 |
能夠是任何xml文件中合法的string,例如空字符串」」,逗號」,」和空格」 」,儘可能避免用這些字符串命名你的target,ant未來的版本可能不會支持由於不一樣的IDE中對這些字串的解釋並不相同。apache
以連字符開始是不合法的,例如」-restart」,由於他們不能被命令行直接命令。由於ant會默認連字符開始的是它本身的而不是一個target。api
一個target能夠依賴其餘的targets.例如,你有一個編譯的target,還有一個建立可分配的target,你只能在你已經編譯的時候才能構建一個可分配的,由於這個可分配的target依賴編譯target。Ant能夠解決這些依賴關係。緩存
須要注意的是,ant依賴屬性只指定了執行targets的順序,若是依賴的目標不須要執行,則不影響指定依賴關係的目標是否執行,即雖然我只能在你後面執行,若是你不執行,那麼我就直接執行。oracle
<target name="clean"> … </target> <target name="init" depends="clean"> … </target>
若是由於某些緣由clean這個target不會執行,那麼init這個target依舊執行app
<target name="A"/> <target name="B" depends="A"/> <target name="C" depends="B"/> <target name="D" depends="C,B,A"/> D的時候,執行的順序是A --> B --> C --> D 爲何呢?由於D依賴C,C又依賴B,B又依賴A,因此順序是這樣的。 <target name="A"/> <target name="B"/> <target name="C"/> <target name="D" depends="C,B,A"/> 這樣寫的話,順序纔是C,B,A,D
<target name="build-module-A" if="module-A-present"/> <target name="build-own-fake-module-A" unless="module-A-present"/>
第一句話意思是若是module-A-present這個屬性被設置了,我就執行build-module-A這個target
第二句話的意思是若是module-A-present這個屬性沒有被設置,我就執行build-own-fake-module-A這個targetless
須要注意的是隻要設置了這個屬性就被控制,而沒有規定其中設置什麼值,例如jvm
<property name=」 module-A-present」/>
即便沒有設置什麼值,我也會運行第一個target,也就是build-module-A
若是想要根據值來控制,能夠運用if/unless attributes 屬性擴展
1.7.1前不支持,即便這個property中沒有設置value或是空字串,1.8.0ant支持屬性擴展。即true,on,yes(相反值:false,off,no)可讓他運行(不運行)
<target name="build-module-A" if="{module-A-present}"/>
If/unless中只能夠有一個property
If/unless只控制他們本身,其實他們的depends在他們以前都已經運行完畢了。
和target相似的是他們擁有一個name和依賴列表,能夠從命令行直接執行,他們在構建過程當中表明着一種狀態。
和target不一樣的是他們不包含任何tasks,他們主要的目的就是收集那些在他們的依賴列表中爲所需狀態作出貢獻的targets 。
Targets能夠經過extensionOf屬性把他們本身加到extension-points的依賴列表中,若是多個target寫在一塊兒,相對位置沒有意義。
擴展點的主要用途是充當要導入
(Import詳見http://ant.apache.org/manual/Tasks/import.html)的構建文件的擴展點。在導入的文件中,擴展點定義必須到達的狀態,而且來自其餘構建文件的目標能夠加入所述擴展點的依賴列表,以便對該狀態做出貢獻。
例如你要導入的構建文件可能須要編碼:
<target name="create-directory-layout"> ... </target> <extension-point name="ready-to-compile" depends="create-directory-layout"/> <target name="compile" depends="ready-to-compile"> ... </target> create-directory-layout --> 'empty slot' --> compile
須要在編譯以前生成一些源代碼,而後在主構建文件中使用相似於
<target name="generate-sources" extensionOf="ready-to-compile"> ... </target> create-directory-layout --> generate-sources --> compile
這樣能夠確保generate-sources這個target在compile target以前執行。
不要使用依賴列表,若是使用了依賴列表,generate-sources這個target只能經過它本身的依賴屬性顯示地依賴他們。
一個task是一段能夠執行的代碼。一個task能夠有不少屬性attribute,屬性attribute的值能夠包含property的引用。在task執行前,這些相關的property就能夠被解決。Task的id屬性用來標識這個task
若是「任務」尚未運行,那麼它沒有配置(即,沒有屬性已設置),若是是要配置後,任何你所作的實例能夠被改寫。
Ant有一系列內置的task(詳見:http://ant.apache.org/manual/tasklist.html),想寫本身的task也很容易(詳見:http://ant.apache.org/manual/develop.html#writingowntask)
屬性是自定義構建過程的一種重要方式,或者只爲在構建文件中重複使用的字符串提供快捷方式。在最簡單的表單中,屬性在生成文件中定義(例如,屬性任務),也能夠在Ant以外設置。屬性有名稱和值;名稱區分大小寫。屬性可用於任務屬性值或支持它們的任務的嵌套文本中。這是經過將屬性名放在屬性值中的「」和「}」之間完成的。例如,若是有一個「builddir」屬性的值「創建」,那麼這多是用於屬性是這樣的:」和「}」之間完成的。例如,若是有一個「builddir」屬性的值「創建」,那麼這多是用於屬性是這樣的: { builddir } /classes。這在運行時做爲buld/classes。
<property name="classes.dir" value="${webcontent.webinf.dir}/classes" description="原項目默認編譯位置"/> <!--清理目標位置 --> <target name="clean"> <delete dir="${classes.dir}" /> </target>
從ant1.8.0開始屬性擴展比簡單的鍵值對變得更增強大
許多task均可以設置properties,最經常使用的就是property 這個task,此外,屬性能夠經過命令行參數或來自Ant外部的相似機制定義。
它只表示字符串數據的名-值對。除了字符串之外,任何其餘數據類型均不能與特性相關聯。
Ant命令行聲明的特性老是比其餘位置定義的特性有更高的優先級。在此以後,ant會根據其什麼時候首次發現所聲明的特性來肯定優先級。
<property name=」property.one」 value=」${property.two}:one」> <property name=」property.two」 value=」two」>
Property.one的值時什麼呢,因爲順序,它的值是${property.two}:one而不是two:one
<target name=」target1」> <property name=」prop2」 value=」two」> </target>
一旦構建了property prop2那麼剩餘的構建文件部分均可以使用prop2特性。
Ant提供對全部系統屬性的訪問,就像它們是使用< property >任務定義的同樣。例如,${os.name }操做系統的名稱。系統屬性詳見:https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getProperties%28%29
basedir
做爲的屬性,它表示該項目的絕對路徑
ant.file
構建文件的絕對路徑
ant.version
Ant的版本
ant.project.name
目前運行的項目名稱,的屬性
ant.project.default-target
目前運行的項目默認target,的屬性
ant.project.invoked-targets
當調用當前的項目時,命令行或IDE指定的以逗號分隔的targets列表
當第一個目標被執行時,此屬性將被正確設置。
若是您在隱式目標中使用它(直接在「項目」標籤下)列表將爲空。
若是沒有指定目標,將包含該項目的默認目標。
ant.java.version
JVM版本,目前它持有, 「9」, 「1.8」,」1.7」, 「1.6」, 「1.5」, 「1.4」, 「1.3」 「1.2」.
ant.core.lib
ant.jar文件的絕對路徑
還有另外一個屬性,但這是由Launcher 的腳本,所以也許不在IDE:
ant.home
ant的home目錄
下面的屬性只設置若是螞蟻開始經過發射類(這意味着它可能沒有設置在IDE的):
ant.library.dir
下載的ant的jar包的目錄,大多數狀況下是ANT_HOME/lib
相似路徑的結構
您能夠指定路徑和路徑的類型引用使用「:」和「;」分隔符。Ant將將分隔符轉換爲當前操做系統的正確字符。
Property特性定義容許咱們避免在構建文件中將目錄名硬編碼。這些路徑一般都是相對於<project>
元素所指定的基目錄
<project name="XXX" default="xxxx" basedir="."> <property name=」src.dir」 value=」src」> </project>
在須要指定路徑值的地方,可使用嵌套元素。這是通常形式的:
<classpath> <pathelement path="${classpath}"/> <pathelement location="lib/helper.jar"/> </classpath>
classpath屬性指定與項目的基目錄(或絕對文件名)相關的單個文件或目錄,而path屬性接受冒號或分號分隔的location列表。path屬性意在與預約義路徑一塊兒使用——在任何其餘狀況下,都應該首選具備location屬性的多個元素
從1.8.2開始location屬性能夠以通配結束爲了java6 介紹的classpaths通配符使用。Java6之前的jvm使用時,ant將不會解釋這個通配符,即path不能正常工做(以通配符結束)。
做爲一種快捷方式,<classpath>
標籤支持path和本身的location屬性,因此:
<classpath> <pathelement path="${classpath}"/> </classpath>
能夠被縮寫爲:
<classpath path="${classpath}"/>
此外,一個或多個資源集合能夠指定爲嵌套元素(這些必須僅包含文件類型資源)。此外,應該指出的是,雖然資源集合的順序處理遇到的,必定的資源的集合類型,如fileset,dirset和files方面的順序是不肯定的。
<classpath> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> <dirset dir="${build.dir}"> <include name="apps/**/classes"/> <exclude name="apps/**/*Test*"/> </dirset> <filelist refid="third-party_jars"/> </classpath>
若是您想要爲幾個任務使用相同的路徑結構,您能夠在與目標相同的級別上使用一個元素來定義它們,並經過它們的id屬性引用它們.
<project ... > <target ... > <rmic ...> <classpath> <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </classpath> </rmic> </target> <target ... > <javac ...> <classpath> <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </classpath> </javac> </target> </project>
能夠這樣簡寫:
<project ... > <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> <target ... > <javac ...> <classpath refid="project.class.path"/> </javac> </target> </project>
默認狀況下,一個相似路徑的結構將在使用時從新評估全部嵌套的資源集合,這可能致使對文件系統進行沒必要要的從新掃描。由於螞蟻1.8.0路徑有一個可選的緩存屬性,若是設置爲true,該路徑實例只會掃描其嵌套資源集合一次,假設它不會改變在創建了(緩存默認仍然是錯誤的)。即便只在單個任務中使用路徑,若是使用複雜的嵌套結構,則能夠提升總體性能,將緩存設置爲true。
一個相似路徑的結構能夠經過嵌套的<路徑>元素包括對另外一個路徑結構(路徑自己就是資源集合)的引用:
<path id="base.path"> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> </path> <path id="tests.path" cache="true"> <path refid="base.path"/> <pathelement location="testclasses"/> </path>
前面提到的<路徑>快捷方式也適用於<路徑>。例如:
<path id="base.path"> <pathelement path="${classpath}"/> </path>
能夠簡寫爲:
<path id="base.path" path="${classpath}"/>
Ant1.6中path增長了一個快捷方式
${toString:pathreference}
<path id="lib.path.ref"> <fileset dir="lib" includes="*.jar"/> </path> <javac srcdir="src" destdir="classes"> <compilerarg arg="-Xbootclasspath/p:${toString:lib.path.ref}"/> </javac>
一類表示複雜數據集合的元素,例如fileset和path
數據元素data element這個詞包含了特性property和datatype
好比:
<property file=」user.properties」>
可表示在當前目錄下找user.properties文件
有的時候property來表示文件路徑很是麻煩:
<property name=」classpath」 value=」${lib.dir}/j2ee.jar:${lib.dir}/activation.jar:${lib.dir}/servlet.jar:${lib.dir}/jasper.jar」>
並且在這個庫中增長和刪除jar都意味着你必須對此路徑字符串作相應的增長和刪除
這個時候你使用datatype就是很是好的辦法:
<path id=」classpath」> <fileset dir=」${lib.dir}」> <include name=」j2ee.jar」/> <include name=」activation.jar」/> <include name=」servlet.jar」/> … </fileset> </path> 固然jar都在同一個目錄下,使用通配符指定一個模式(而property卻不能夠指定模式) <path id=」classpath」> <fileset dir=」${lib.dir}」> <include name=」**/*.jar」/> </fileset> </path>
Fileset只是可用DataType中的一種,如下列出其餘可用的DataType:
對於由一個ant構建文件調用的程序,向其傳遞命令行參數
對於由一個ant構建文件調用的外部命令或程序,指定向其傳遞的環境變量
定義一個文件的命名列表,這些文件無需確實存在
定義一個文件的命名列表,這些文件必須確實存在
將一組模式分組在一塊兒
將一組過濾分組在一塊兒
以某種在不一樣操做系統間可移植的方式指定路徑
定義一組輸入文件和一組輸出文件間的複雜關係。
語法:ant [option [option…]] [target[target…]]
ant -help可查出全部命令行命令
咱們從包括build.xml文件的目錄鍵入如下命令:
ant
Ant將打開一個默認的構建文件,即build.xml並執行此構建文件的默認目標(即project的default屬性)(若是默認目標有依賴目標就會先去執行依賴目標再執行默認目標;若是默認目標不存在會返回一個錯誤)
指定構建文件名
ant -buildfile proj.xml
執行指定的target
ant -buildfile proj.xml clean
關於這個工程的構建詳情
ant -projecthelp
Buildfile:build.xml
Default target:
Compile Compiles all sources code
Main targets:
All cleans,compiles,then builds the jar file
Clean removes all generated files
Compile compiles all source codes
Substargets:
Prepare
BUILD SUCCESSFUL
Total time:2 seconds
這個工程的幫助詳情,其中targets被分爲主目標和子目標,是根據有無描述descrption來區分的,可是執行的時候並沒有區別。在此只是爲了顯示。
All cleans,compiles,then builds the jar file
右側的爲all這個target的descrption屬性
cc-lady, Ant筆記(二)Ant使用, https://blog.csdn.net/cc907566076/article/details/78604487