1. 程式人生 > >從原始碼角度深入分析ant

從原始碼角度深入分析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解析配置檔案buildtasks的順序流程:

 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

Mail

傳送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