從原始碼角度深入分析ant
Ant的基本概念
首先是ant的基本概念:Project,Target,Tasks,Properties,Paths
1.Project
<project> build.xml檔案最頂層的元素,它有三個可選的屬性: 名稱(name):工程的名稱 預設(default):預設的目標(target)。 基礎目錄(basedir):工程的根目錄,工程所有的相對路徑從此算起。
2. target
每個project定義了0個或者多個target,是project的次級目錄。
一個target是一組要執行的task組成的。
當啟動ant時,可以選擇你想要執行的target,如果沒有指定,就執行project的屬性default定義的target。 可以依據條件(使用IF/UNLESS)來決定是否執行。一個target的執行可以依賴另一個target。 target的依賴是可以傳遞的。依賴的target先執行。例如:
<target name="A"/> <target name="B" depends="A"/> <target name="C" depends="A"/> <target name="D" depends="B,C"/>
其中,如果我們需要執行target D,而D的執行依賴於Target B和C,B和C又依賴於A。 因此,要執行target D,首先要執行A,然後是B,然後是C,最後才是D
3.Task
task是一些可以執行的命令,它有許多屬性(例如引數)。ant有超過80個核心task,超過60個可選task,超過100個第三方工具和task。
對於特定的問題,也可以自定義一個ant task擴充套件。
4.Properties
一個屬性有名稱和值,名稱是大小寫敏感。
屬性可以用在task的定義的屬性中,可以通過使用${屬性名稱}來獲取屬性值,然後放置到task的屬性中。 例如:如果一個屬性名為:builddir,其值為"build"。那麼可以在task使用${buiddir}變數。在執行時就解析為build。 屬性是不可變的,即一旦屬性名及其值定義,編譯中的其它部分只能引用不可以重新定義或者改變其值。
4.1 設定屬性 - 前置屬性
當同一個屬性被多次定義時,第一次的定義起效,接下來所有的定義都不會生效。下面是前置屬性的規則:
可以使用命令列定義前置屬性:-Dname=value
<project>元素下面的<property>元素根據書寫的順序定義。
<target>元素下面的<property>元素根據它們執行的順序。
4.2 設定屬性示例 設定一個屬性foo.dist 其值為 "dist":<property name="foo.dist" value="dist"/>
從一個名為"foo.properties"的檔案中讀取一組屬性:<property file="foo.properties"/>
從classpath 的資原始檔foo.properties中讀取一組屬性:<property resource="foo.properties"/>
從系統環境變數中讀取和儲存屬性:<property environment="env"/>
4.3 內建屬性
如果定義了<property>task,那麼ant可以訪問所有的系統屬性。例如:${os.name}作業系統名稱,更多的系統資訊參見system.getProperties()
另外,ant還有一些內建屬性:
basedir
工程的基礎目錄的絕對路徑(<project>中定義的basedir屬性) ant.file
構建檔案的絕對路徑。 ant.version ant的版本資訊
更多的內建屬性:
ant.project.name
當前執行工程的名稱,<project>中定義的name屬性。 ant.java.version
ant發現的JVM版本,當前包含的值: "1.1", "1.2", "1.3", "1.4", "1.5" ,"1.6"
5 path
<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>
Ant執行流程
接下來,我們分享一下ant解析配置檔案build為tasks的順序流程:
Ant核心之Task
從上面的解析我們可以看到ant的核心就是task,那麼我們來了解ant有哪些task呢?
1. Archive Tasks
BUnzip2
解壓gzip或者bzip2壓縮的檔案
BZip2
使用gzip或者bzips演算法壓縮檔案,這個task沒有依賴檢查,直接產生輸出檔案。
Cab
建立一個微軟CAB壓縮檔案,這個task類似於jar或者zip task。這個task只要適用在windows環境中。
Ear
jar task的擴充套件,根據企業應用檔案結構打包。
GUnzip
解壓一個gzip檔案。
GZip
gzip壓縮一組檔案
Jar Jar壓縮一組檔案.
Jlink 過期的. 使用jar或者zip task中的zipfileset和zipgroupfileset屬性替代.
Manifest
建立一個mainifest檔案
Rpm
啟用可以執行的rpm命令來構建一個linux的安裝檔案。這個task目前僅使用在rpm支援的linux或者unix平臺。
SignJar
使用javasign命令列工具來給一個jar或者zip檔案進行加簽。
Tar 建立一個tar壓縮包。
Unjar
解壓一個jar檔案
Untar 解壓一個tar檔案
Unwar 解壓一個war檔案
Unzip 解壓一個zip檔案
War
jar task的擴充套件,以web應用檔案格式壓縮WEB-INF/lib,WEB-INF/classs等檔案
Zip 建立一個zip檔案
2. Audit/Coverage Tasks
JDepend :觸發一個JDepend 解析器。這個解析器變數一組java原始檔目錄,產生符合設定標準的java包。
3. Compile Tasks
Depend
確定相對於它們的原始檔,哪些類檔案是過期的,移除依賴於過期類的類檔案,強制重新編譯移除後的類檔案,通常和javac這個task一起使用。
Javac
在執行的vm上或者設定了fork屬性的另一個vm上編譯替代的原始檔。
Apt
執行註釋處理器工具(apt).
JspC
執行jsp編譯器。 Runs the JSP compiler. (要了解 Weblogic JSP 編譯器, 參見 Wljspc task.)
NetRexxC
在執行的vm上編譯NetRexx 原始碼樹。
Rmic
對於特定檔案執行rmic編譯器。
Wljspc
使用weblogic jsp編譯器編譯jsp頁面,類weblogic.jspc (對於非Weblogic JSP編譯器, 參見JspC task.)
4. Deployment Tasks
ServerDeploy
針對特定的J2EE伺服器,執行熱部署的task
5. Documentation Tasks
Javadoc/Javadoc2
使用javadoc工具產生一個程式碼檔案。javadoc2已經過期,使用javadoc task替換。
6. EJB Tasks
(參見關於EJB task相關描述的文件)
7.執行Task
Ant
根據給定的構建檔案執行ant。
AntCall
同一個構建檔案,執行另外一個target。
Apply/ExecOn
執行系統命令。
Dependset
這個task將一組原始檔和一組target檔案進行比較。若存在原始檔新於target檔案,將刪除所有的target檔案。
Exec
執行系統命令。
Java
在執行的vm或者設定了fork屬性的另一個vm上執行java類。
Parallel
一個容器task,可以包含其它的task。在<parallel>標籤內嵌的task將執行自己單獨的執行緒。
Sequential
一個容器task,可以包含其它的task。在<sequential>標籤內嵌的task安裝順序執行task。
Sleep
暫停執行特定時間的task。
Subant
對所有已定義的子構建呼叫指定target。
Waitfor
當一組特定條件滿足時阻塞執行。
8. 檔案Task
Attrib
改變特定目錄下的一個檔案或者所有檔案的許可權屬性。當前,僅在windows下起效。
Checksum
為一個檔案或者一組檔案產生一個檢測串,它可以用來檢測檔案的完整性。
Chgrp
改變特定目錄下一個檔案或者所有檔案的組別屬性。當前僅在unix有效。
Chmod
改變特定目錄下的一個檔案或者所有檔案的許可權屬性。當前,僅在unix下起效,類似於unix的chmod命令。
Chown
改變特定目錄下的一個檔案或者所有檔案的屬主資訊。當前,僅在unix下起效。
Concat
連線多個檔案成為一個檔案。
Copy
賦值一個檔案或者檔案組到一個新的檔案或者檔案目錄。
Copydir
過期的。使用copy task替代它即可。
Copyfile 過期的。使用copy task替代它即可。
Delete
刪除特定目錄下的一個檔案、所有檔案、子目錄,或者刪除一個或者多個檔案組的一組檔案。
Deltree 過期的。使用Delete task替代它即可。
Filter
為這個project設定一個字元過濾器或者從一個指定檔案中讀取多個字元過濾器作為過濾器。字元過濾器用在所有檔案複製操作的task上。
FixCRLF
修改檔案新增或刪除製表符,回車,換行,和EOF字元。
Get
根據URL獲取一個檔案。
Mkdir
建立一個目錄。需要時,可以建立不存在的父目錄。
Move
移動一個檔案到新檔案或者新的檔案目錄,或者移動一組檔案到新的檔案目錄中。
Patch
將新檔案替換就檔案。
Rename 過期的. 使用Move task替代。
RenameExtensions
過期的. 使用Move task和一個全域性對映器替代。
Replace
一個基於目錄的task,在選定的檔案中用給定的字串替換另外一個字串。
ReplaceRegExp
基於目錄的task,在選定的檔案或者檔案組中使用正則表示式替換字元。
Sync
同步兩個目錄樹。
Tempfile
產生一個臨時檔案的名稱,並設定屬性到那個臨時檔名。
Touch
改變一個檔案的修改時間或者建立一個新的檔案。
9. Java2 Extensions Task
Jarlib-available
檢測擴充套件是否存在於檔案組或者擴充套件組中。
Jarlib-display
顯示特定jar內包含的“可選包”及“包定義”。
Jarlib-manifest
產生一個定義所有依賴的manifest檔案的task。
Jarlib-resolve
試圖定位一個jar來滿足擴充套件,將jar的位置放到特定的屬性中。
10. Logging Tasks
Record
執行一個監聽器,記錄構建處理事件輸出到一個檔案中。不同的記錄器可以在同一時間退出。每個記錄器對應一個檔案。
11. Mail Tasks
傳送SMTP郵件的task。
MimeMail
過期的。可以使用Mail task來替換。
12. Miscellaneous Tasks
Defaultexcludes
在構建檔案中,修改預設排除模式的組。
Echo
向控制檯或者檔案輸出字串。
Fail
通過跑出構建異常來退出當前構建。是否列印額外的資訊是可選的。
GenKey
在keystore中產生一個key。
HostInfo
設定關於當前指定host或者當前host的屬性資訊。
Input
執行在構建處理過程中,通過控制顯示或者讀取控制輸入一行的訊息來和使用者互動。
Script
執行指令碼
Sound
根據構建成功或者失敗,在構建結束時播放音訊檔案。
Splash
顯示一個splash屏
Sql
執行一組通過jdbc連線到資料的sql語句。這個sql語句要麼從src屬性下設定的檔案中讀取,要麼是sql標籤封裝的語句。
Taskdef
為當前project增加一個task定義, 新增一個task定義到當前project,使得這項新的task可以用在當前的project。
TStamp
基於當前日期和時間,設定當前project的DSTAMP, TSTAMP,TODAY屬性。
Typedef
新增一個新的資料類定義到當前project,使得這項新的型別可以用在當前的project中。
XmlValidate
檢查xml檔案是否有效。
13. 預處理Task
ANTLR
激發一個語法檔案的ANTLR轉換生成器。
AntStructure
給一個ant 構建檔案產生一個DTD檔案,改DTD檔案包含了關於當前ant所有已知task的資訊。
Import
引入另外一個構建檔案,改構建檔案中的target可能被你自己的構建檔案中的target覆蓋。
Include
包含另外一個構建檔案。
JavaCC
激發一個語法檔案的 JavaCC compiler-compiler
Javah
根據一個java類產生JNI頭。
JJDoc
觸發 JavaCC compiler-compiler的JJDoc檔案產生器。
JJTree
觸發 JavaCC compiler-compiler的JJTree前處理器。
Macrodef
定義一個新的基於其它task的task作為巨集。
Native2Ascii
將一個本地編碼的檔案轉換為使用escape編碼格式的ASCII碼檔案。
Presetdef
根據一個已存在task的預設屬性值或者子元素定義一個新的task。
Translate
驗證在檔案中被特殊字元分割的鍵,轉換成從資源束總讀取的值。
XSLT
通過XSLT處理一組文件。
14. Property Tasks
Available
若執行時一個特定的檔案、目錄、classpath下面的類或者JVM 系統資源是可以獲取的,那麼可以設定屬性。
Basename
設定一個指定的路徑的最後一個元素的屬性。
BuildNumber
用來跟蹤構建行數的task。
Condition
若特定的條件為true,則設定屬性。它是Avaiable和uptodate的實現。
Dirname
對指定檔案的值設定屬性,但不包含改路徑的最後元素。
Echoproperties
列舉當前的屬性。
LoadFile
將檔案載入到一個屬性中。
LoadProperties
載入一個檔案的內容作為ant的屬性。這個task等同於使用<property file="..."/>,不同點事它支援巢狀<filterchain>元素,但不能在target外部定義。
MakeURL
根據一個檔案、檔案組或者路徑建立一個URL(url陣列)。
PathConvert
Converts a nested path, path reference, filelist reference, or fileset reference to the form usable on a specified platform and/or to a list of items separated by the specified separator and stores the result in the specified property.
Property
在project中設定一個屬性(名稱和值)或者一組屬性(從檔案或者資源上)
PropertyFile
建立或者修改屬性檔案。適用在需要修改應用伺服器或者一個應用的配置檔案時。通常用在自動產生構建數目並儲存到構建屬性檔案中,或者對時間進行操作。
Uptodate
若指定檔案新於一組原始檔,則設定屬性。
Whichresource
查詢類或者資源
XmlProperty
從一個格式化完好的xml檔案中載入屬性值。
15. Remote Tasks
FTP
集成了基本的ftp客戶端功能,實現傳送,接受,列舉,刪除檔案,建立檔案的功能。
Rexec
自動建立一個遠端重執行回話的task。
Scp
使用ssh從一個遠端伺服器讀取或者寫入檔案。
setproxy
設定java web的代理屬性,從而執行在同一個虛擬機器上的程式碼和任務可以穿越防火牆訪問遠端的web站點。
Sshexec
使用ssh在遠端伺服器上執行excute命令
Telnet
自動連線一個遠端telnet回話的task,這個task使用巢狀的<read>和<write>標籤接收字元 串和傳送字串。
16. SCM Tasks
Cvs
處理來自cvs庫的包或者模組。
CvsChangeLog
產生一個在cvs庫上變化記錄的xml報告。 CVSPass
在.cvspass檔案中增加新的鍵。這種方式與cvs登陸命令上的效果相同。
CvsTagDiff
建立一個xml格式的報告檔案,它記錄了在cvs庫上兩個分支或者日期上記錄的變化。
ClearCase
執行ClearCase cleartool 命令:checkin, checkout, uncheckout, update, lock, unlock, mklbtype, rmtype, mklabel, mkattr, mkdir, mkelem, mkbl的task。
Continuus/Synergy
執行Continuus命令ccmcheckin, ccmcheckout, ccmcheckintask, ccmreconfigure和ccmcreateTask的task
Microsoft Visual SourceSafe
執行視覺化SourceSafe命令vssget, vsslabel, vsshistory, vsscheckin, vsscheckout, vssadd, vsscp, 和 vsscreate的task
Pvcs
執行使用者行pvcs庫提取最新版本的原始碼。
SourceOffSite
執行SourceOffSite命令sosget, soslabel, soscheckin, soscheckout的task。
17. Testing Tasks
Junit
執行Junit測試框架的測試用例。這個task已經在Junit3.0到Junit3.7版本上進行了測試。但不支援Junit3 以前的版本。
JunitReport
合併Junit task產生的單獨的xml檔案,應用到styleSheet形式文件,提供給使用者一個可以瀏覽檢視測試用例結果的文件。
命令和原始碼不解之緣
/org/apache/tools/ant/taskdefs/default.properties檔案將task和原始碼關聯到一起。
# standard ant tasks ant=org.apache.tools.ant.taskdefs.Ant antcall=org.apache.tools.ant.taskdefs.CallTarget antstructure=org.apache.tools.ant.taskdefs.AntStructure antversion=org.apache.tools.ant.taskdefs.condition.AntVersion apply=org.apache.tools.ant.taskdefs.Transform apt=org.apache.tools.ant.taskdefs.Apt attributenamespacedef=org.apache.tools.ant.taskdefs.AttributeNamespaceDef augment=org.apache.tools.ant.taskdefs.AugmentReference available=org.apache.tools.ant.taskdefs.Available basename=org.apache.tools.ant.taskdefs.Basename bindtargets=org.apache.tools.ant.taskdefs.BindTargets buildnumber=org.apache.tools.ant.taskdefs.BuildNumber bunzip2=org.apache.tools.ant.taskdefs.BUnzip2 bzip2=org.apache.tools.ant.taskdefs.BZip2 checksum=org.apache.tools.ant.taskdefs.Checksum chmod=org.apache.tools.ant.taskdefs.Chmod classloader=org.apache.tools.ant.taskdefs.Classloader commandlauncher=org.apache.tools.ant.taskdefs.CommandLauncherTask componentdef=org.apache.tools.ant.taskdefs.Componentdef concat=org.apache.tools.ant.taskdefs.Concat condition=org.apache.tools.ant.taskdefs.ConditionTask copy=org.apache.tools.ant.taskdefs.Copy cvs=org.apache.tools.ant.taskdefs.Cvs cvschangelog=org.apache.tools.ant.taskdefs.cvslib.ChangeLogTask cvspass=org.apache.tools.ant.taskdefs.CVSPass cvstagdiff=org.apache.tools.ant.taskdefs.cvslib.CvsTagDiff cvsversion=org.apache.tools.ant.taskdefs.cvslib.CvsVersion defaultexcludes=org.apache.tools.ant.taskdefs.DefaultExcludes delete=org.apache.tools.ant.taskdefs.Delete dependset=org.apache.tools.ant.taskdefs.DependSet diagnostics=org.apache.tools.ant.taskdefs.DiagnosticsTask dirname=org.apache.tools.ant.taskdefs.Dirname ear=org.apache.tools.ant.taskdefs.Ear echo=org.apache.tools.ant.taskdefs.Echo echoproperties=org.apache.tools.ant.taskdefs.optional.EchoProperties echoxml=org.apache.tools.ant.taskdefs.EchoXML exec=org.apache.tools.ant.taskdefs.ExecTask fail=org.apache.tools.ant.taskdefs.Exit filter=org.apache.tools.ant.taskdefs.Filter fixcrlf=org.apache.tools.ant.taskdefs.FixCRLF #funtest=org.apache.tools.ant.taskdefs.optional.testing.Funtest genkey=org.apache.tools.ant.taskdefs.GenerateKey get=org.apache.tools.ant.taskdefs.Get gunzip=org.apache.tools.ant.taskdefs.GUnzip gzip=org.apache.tools.ant.taskdefs.GZip hostinfo=org.apache.tools.ant.taskdefs.HostInfo import=org.apache.tools.ant.taskdefs.ImportTask include=org.apache.tools.ant.taskdefs.ImportTask input=org.apache.tools.ant.taskdefs.Input jar=org.apache.tools.ant.taskdefs.Jar java=org.apache.tools.ant.taskdefs.Java javac=org.apache.tools.ant.taskdefs.Javac javadoc=org.apache.tools.ant.taskdefs.Javadoc length=org.apache.tools.ant.taskdefs.Length loadfile=org.apache.tools.ant.taskdefs.LoadFile loadproperties=org.apache.tools.ant.taskdefs.LoadProperties loadresource=org.apache.tools.ant.taskdefs.LoadResource local=org.apache.tools.ant.taskdefs.Local macrodef=org.apache.tools.ant.taskdefs.MacroDef mail=org.apache.tools.ant.taskdefs.email.EmailTask makeurl=org.apache.tools.ant.taskdefs.MakeUrl manifest=org.apache.tools.ant.taskdefs.ManifestTask manifestclasspath=org.apache.tools.ant.taskdefs.ManifestClassPath mkdir=org.apache.tools.ant.taskdefs.Mkdir move=org.apache.tools.ant.taskdefs.Move nice=org.apache.tools.ant.taskdefs.Nice parallel=org.apache.tools.ant.taskdefs.Parallel patch=org.apache.tools.ant.taskdefs.Patch pathconvert=org.apache.tools.ant.taskdefs.PathConvert presetdef=org.apache.tools.ant.taskdefs.PreSetDef projecthelper=org.apache.tools.ant.taskdefs.ProjectHelperTask property=org.apache.tools.ant.taskdefs.Property propertyhelper=org.apache.tools.ant.taskdefs.PropertyHelperTask record=org.apache.tools.ant.taskdefs.Recorder replace=org.apache.tools.ant.taskdefs.Replace resourcecount=org.apache.tools.ant.taskdefs.ResourceCount retry=org.apache.tools.ant.taskdefs.Retry rmic=org.apache.tools.ant.taskdefs.Rmic sequential=org.apache.tools.ant.taskdefs.Sequential signjar=org.apache.tools.ant.taskdefs.SignJar sleep=org.apache.tools.ant.taskdefs.Sleep sql=org.apache.tools.ant.taskdefs.SQLExec subant=org.apache.tools.ant.taskdefs.SubAnt sync=org.apache.tools.ant.taskdefs.Sync tar=org.apache.tools.ant.taskdefs.Tar taskdef=org.apache.tools.ant.taskdefs.Taskdef tempfile=org.apache.tools.ant.taskdefs.TempFile touch=org.apache.tools.ant.taskdefs.Touch tstamp=org.apache.tools.ant.taskdefs.Tstamp truncate=org.apache.tools.ant.taskdefs.Truncate typedef=org.apache.tools.ant.taskdefs.Typedef unjar=org.apache.tools.ant.taskdefs.Expand untar=org.apache.tools.ant.taskdefs.Untar unwar=org.apache.tools.ant.taskdefs.Expand unzip=org.apache.tools.ant.taskdefs.Expand uptodate=org.apache.tools.ant.taskdefs.UpToDate waitfor=org.apache.tools.ant.taskdefs.WaitFor war=org.apache.tools.ant.taskdefs.War whichresource=org.apache.tools.ant.taskdefs.WhichResource xmlproperty=org.apache.tools.ant.taskdefs.XmlProperty xslt=org.apache.tools.ant.taskdefs.XSLTProcess zip=org.apache.tools.ant.taskdefs.Zip # optional tasks antlr=org.apache.tools.ant.taskdefs.optional.ANTLR attrib=org.apache.tools.ant.taskdefs.optional.windows.Attrib blgenclient=org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient cab=org.apache.tools.ant.taskdefs.optional.Cab cccheckin=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin cccheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout cclock=org.apache.tools.ant.taskdefs.optional.clearcase.CCLock ccmcheckin=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin ccmcheckintask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault ccmcheckout=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout ccmcreatetask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask ccmkattr=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkattr ccmkbl=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkbl ccmkdir=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkdir ccmkelem=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkelem ccmklabel=org.apache.tools.ant.taskdefs.optional.clearcase.CCMklabel ccmklbtype=org.apache.tools.ant.taskdefs.optional.clearcase.CCMklbtype ccmreconfigure=org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure ccrmtype=org.apache.tools.ant.taskdefs.optional.clearcase.CCRmtype ccuncheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout ccunlock=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnlock ccupdate=org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate chgrp=org.apache.tools.ant.taskdefs.optional.unix.Chgrp chown=org.apache.tools.ant.taskdefs.optional.unix.Chown depend=org.apache.tools.ant.taskdefs.optional.depend.Depend ejbjar=org.apache.tools.ant.taskdefs.optional.ejb.EjbJar ftp=org.apache.tools.ant.taskdefs.optional.net.FTP image=org.apache.tools.ant.taskdefs.optional.image.Image iplanet-ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask jarlib-available=org.apache.tools.ant.taskdefs.optional.extension.JarLibAvailableTask jarlib-display=org.apache.tools.ant.taskdefs.optional.extension.JarLibDisplayTask jarlib-manifest=org.apache.tools.ant.taskdefs.optional.extension.JarLibManifestTask jarlib-resolve=org.apache.tools.ant.taskdefs.optional.extension.JarLibResolveTask javacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCC javah=org.apache.tools.ant.taskdefs.optional.Javah jdepend=org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask jjdoc=org.apache.tools.ant.taskdefs.optional.javacc.JJDoc jjtree=org.apache.tools.ant.taskdefs.optional.javacc.JJTree junit=org.apache.tools.ant.taskdefs.optional.junit.JUnitTask junitreport=org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator native2ascii=org.apache.tools.ant.taskdefs.optional.Native2Ascii netrexxc=org.apache.tools.ant.taskdefs.optional.NetRexxC propertyfile=org.apache.tools.ant.taskdefs.optional.PropertyFile pvcs=org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs replaceregexp=org.apache.tools.ant.taskdefs.optional.ReplaceRegExp rexec=org.apache.tools.ant.taskdefs.optional.net.RExecTask rpm=org.apache.tools.ant.taskdefs.optional.Rpm schemavalidate=org.apache.tools.ant.taskdefs.optional.SchemaValidate scp=org.apache.tools.ant.taskdefs.optional.ssh.Scp script=org.apache.tools.ant.taskdefs.optional.Script scriptdef=org.apache.tools.ant.taskdefs.optional.script.ScriptDef serverdeploy=org.apache.tools.ant.taskdefs.optional.j2ee.ServerDeploy setproxy=org.apache.tools.ant.taskdefs.optional.net.SetProxy soscheckin=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin soscheckout=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout sosget=org.apache.tools.ant.taskdefs.optional.sos.SOSGet soslabel=org.apache.tools.ant.taskdefs.optional.sos.SOSLabel sound=org.apache.tools.ant.taskdefs.optional.sound.SoundTask splash=org.apache.tools.ant.taskdefs.optional.splash.SplashTask sshexec=org.apache.tools.ant.taskdefs.optional.ssh.SSHExec sshsession=org.apache.tools.ant.taskdefs.optional.ssh.SSHSession symlink=org.apache.tools.ant.taskdefs.optional.unix.Symlink telnet=org.apache.tools.ant.taskdefs.optional.net.TelnetTask translate=org.apache.tools.ant.taskdefs.optional.i18n.Translate verifyjar=org.apache.tools.ant.taskdefs.VerifyJar vssadd=org.apache.tools.ant.taskdefs.optional.vss.MSVSSADD vsscheckin=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN vsscheckout=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT vsscp=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCP vsscreate=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCREATE vssget=org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET vsshistory=org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY vsslabel=org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL wljspc=org.apache.tools.ant.taskdefs.optional.jsp.WLJspc xmlvalidate=org.apache.tools.ant.taskdefs.optional.XMLValidateTask # deprecated ant tasks (kept for back compatibility) copydir=org.apache.tools.ant.taskdefs.Copydir copyfile=org.apache.tools.ant.taskdefs.Copyfile copypath=org.apache.tools.ant.taskdefs.CopyPath deltree=org.apache.tools.ant.taskdefs.Deltree execon=org.apache.tools.ant.taskdefs.ExecuteOn javadoc2=org.apache.tools.ant.taskdefs.Javadoc jlink=org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask jspc=org.apache.tools.ant.taskdefs.optional.jsp.JspC mimemail=org.apache.tools.ant.taskdefs.optional.net.MimeMail rename=org.apache.tools.ant.taskdefs.Rename renameext=org.apache.tools.ant.taskdefs.optional.RenameExtensions style=org.apache.tools.ant.taskdefs.XSLTProcess
ant將所有的task都封裝一起,它們繼承了Task類,通過DispatchUtils 將task進行分發,ComponentHelper來產生task。
public Task createTask(String taskType) throws BuildException { Task task = createNewTask(taskType); if (task == null && taskType.equals(ANT_PROPERTY_TASK)) { // quick fix for Ant.java use of property before // initializing the project addTaskDefinition(ANT_PROPERTY_TASK, org.apache.tools.ant.taskdefs.Property.class); task = createNewTask(taskType); } return task; }
參考資料:
http://www.exubero.com/ant/antintro-s5.html
https://ant.apache.org/manual/tasksoverview.html