首页 > 代码库 > 从源码角度深入分析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="http://www.mamicode.com/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 编译器, 参见 Wljspctask.)

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等同于使用<propertyfile="..."/>,不同点事它支持嵌套<filterchain>元素,但不能在target外部定义。

MakeURL

根据一个文件、文件组或者路径创建一个URL(url数组)。

PathConvert

Converts a nested path, path reference,filelist reference, or fileset reference to the form usable on a specifiedplatform and/or to a list of items separated by the specified separator andstores 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 tasksant=org.apache.tools.ant.taskdefs.Antantcall=org.apache.tools.ant.taskdefs.CallTargetantstructure=org.apache.tools.ant.taskdefs.AntStructureantversion=org.apache.tools.ant.taskdefs.condition.AntVersionapply=org.apache.tools.ant.taskdefs.Transformapt=org.apache.tools.ant.taskdefs.Aptattributenamespacedef=org.apache.tools.ant.taskdefs.AttributeNamespaceDefaugment=org.apache.tools.ant.taskdefs.AugmentReferenceavailable=org.apache.tools.ant.taskdefs.Availablebasename=org.apache.tools.ant.taskdefs.Basenamebindtargets=org.apache.tools.ant.taskdefs.BindTargetsbuildnumber=org.apache.tools.ant.taskdefs.BuildNumberbunzip2=org.apache.tools.ant.taskdefs.BUnzip2bzip2=org.apache.tools.ant.taskdefs.BZip2checksum=org.apache.tools.ant.taskdefs.Checksumchmod=org.apache.tools.ant.taskdefs.Chmodclassloader=org.apache.tools.ant.taskdefs.Classloadercommandlauncher=org.apache.tools.ant.taskdefs.CommandLauncherTaskcomponentdef=org.apache.tools.ant.taskdefs.Componentdefconcat=org.apache.tools.ant.taskdefs.Concatcondition=org.apache.tools.ant.taskdefs.ConditionTaskcopy=org.apache.tools.ant.taskdefs.Copycvs=org.apache.tools.ant.taskdefs.Cvscvschangelog=org.apache.tools.ant.taskdefs.cvslib.ChangeLogTaskcvspass=org.apache.tools.ant.taskdefs.CVSPasscvstagdiff=org.apache.tools.ant.taskdefs.cvslib.CvsTagDiffcvsversion=org.apache.tools.ant.taskdefs.cvslib.CvsVersiondefaultexcludes=org.apache.tools.ant.taskdefs.DefaultExcludesdelete=org.apache.tools.ant.taskdefs.Deletedependset=org.apache.tools.ant.taskdefs.DependSetdiagnostics=org.apache.tools.ant.taskdefs.DiagnosticsTaskdirname=org.apache.tools.ant.taskdefs.Dirnameear=org.apache.tools.ant.taskdefs.Earecho=org.apache.tools.ant.taskdefs.Echoechoproperties=org.apache.tools.ant.taskdefs.optional.EchoPropertiesechoxml=org.apache.tools.ant.taskdefs.EchoXMLexec=org.apache.tools.ant.taskdefs.ExecTaskfail=org.apache.tools.ant.taskdefs.Exitfilter=org.apache.tools.ant.taskdefs.Filterfixcrlf=org.apache.tools.ant.taskdefs.FixCRLF#funtest=org.apache.tools.ant.taskdefs.optional.testing.Funtestgenkey=org.apache.tools.ant.taskdefs.GenerateKeyget=org.apache.tools.ant.taskdefs.Getgunzip=org.apache.tools.ant.taskdefs.GUnzipgzip=org.apache.tools.ant.taskdefs.GZiphostinfo=org.apache.tools.ant.taskdefs.HostInfoimport=org.apache.tools.ant.taskdefs.ImportTaskinclude=org.apache.tools.ant.taskdefs.ImportTaskinput=org.apache.tools.ant.taskdefs.Inputjar=org.apache.tools.ant.taskdefs.Jarjava=org.apache.tools.ant.taskdefs.Javajavac=org.apache.tools.ant.taskdefs.Javacjavadoc=org.apache.tools.ant.taskdefs.Javadoclength=org.apache.tools.ant.taskdefs.Lengthloadfile=org.apache.tools.ant.taskdefs.LoadFileloadproperties=org.apache.tools.ant.taskdefs.LoadPropertiesloadresource=org.apache.tools.ant.taskdefs.LoadResourcelocal=org.apache.tools.ant.taskdefs.Localmacrodef=org.apache.tools.ant.taskdefs.MacroDefmail=org.apache.tools.ant.taskdefs.email.EmailTaskmakeurl=org.apache.tools.ant.taskdefs.MakeUrlmanifest=org.apache.tools.ant.taskdefs.ManifestTaskmanifestclasspath=org.apache.tools.ant.taskdefs.ManifestClassPathmkdir=org.apache.tools.ant.taskdefs.Mkdirmove=org.apache.tools.ant.taskdefs.Movenice=org.apache.tools.ant.taskdefs.Niceparallel=org.apache.tools.ant.taskdefs.Parallelpatch=org.apache.tools.ant.taskdefs.Patchpathconvert=org.apache.tools.ant.taskdefs.PathConvertpresetdef=org.apache.tools.ant.taskdefs.PreSetDefprojecthelper=org.apache.tools.ant.taskdefs.ProjectHelperTaskproperty=org.apache.tools.ant.taskdefs.Propertypropertyhelper=org.apache.tools.ant.taskdefs.PropertyHelperTaskrecord=org.apache.tools.ant.taskdefs.Recorderreplace=org.apache.tools.ant.taskdefs.Replaceresourcecount=org.apache.tools.ant.taskdefs.ResourceCountretry=org.apache.tools.ant.taskdefs.Retryrmic=org.apache.tools.ant.taskdefs.Rmicsequential=org.apache.tools.ant.taskdefs.Sequentialsignjar=org.apache.tools.ant.taskdefs.SignJarsleep=org.apache.tools.ant.taskdefs.Sleepsql=org.apache.tools.ant.taskdefs.SQLExecsubant=org.apache.tools.ant.taskdefs.SubAntsync=org.apache.tools.ant.taskdefs.Synctar=org.apache.tools.ant.taskdefs.Tartaskdef=org.apache.tools.ant.taskdefs.Taskdeftempfile=org.apache.tools.ant.taskdefs.TempFiletouch=org.apache.tools.ant.taskdefs.Touchtstamp=org.apache.tools.ant.taskdefs.Tstamptruncate=org.apache.tools.ant.taskdefs.Truncatetypedef=org.apache.tools.ant.taskdefs.Typedefunjar=org.apache.tools.ant.taskdefs.Expanduntar=org.apache.tools.ant.taskdefs.Untarunwar=org.apache.tools.ant.taskdefs.Expandunzip=org.apache.tools.ant.taskdefs.Expanduptodate=org.apache.tools.ant.taskdefs.UpToDatewaitfor=org.apache.tools.ant.taskdefs.WaitForwar=org.apache.tools.ant.taskdefs.Warwhichresource=org.apache.tools.ant.taskdefs.WhichResourcexmlproperty=org.apache.tools.ant.taskdefs.XmlPropertyxslt=org.apache.tools.ant.taskdefs.XSLTProcesszip=org.apache.tools.ant.taskdefs.Zip # optional tasksantlr=org.apache.tools.ant.taskdefs.optional.ANTLRattrib=org.apache.tools.ant.taskdefs.optional.windows.Attribblgenclient=org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClientcab=org.apache.tools.ant.taskdefs.optional.Cabcccheckin=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckincccheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckoutcclock=org.apache.tools.ant.taskdefs.optional.clearcase.CCLockccmcheckin=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinccmcheckintask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefaultccmcheckout=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckoutccmcreatetask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTaskccmkattr=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkattrccmkbl=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkblccmkdir=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkdirccmkelem=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkelemccmklabel=org.apache.tools.ant.taskdefs.optional.clearcase.CCMklabelccmklbtype=org.apache.tools.ant.taskdefs.optional.clearcase.CCMklbtypeccmreconfigure=org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigureccrmtype=org.apache.tools.ant.taskdefs.optional.clearcase.CCRmtypeccuncheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckoutccunlock=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnlockccupdate=org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdatechgrp=org.apache.tools.ant.taskdefs.optional.unix.Chgrpchown=org.apache.tools.ant.taskdefs.optional.unix.Chowndepend=org.apache.tools.ant.taskdefs.optional.depend.Dependejbjar=org.apache.tools.ant.taskdefs.optional.ejb.EjbJarftp=org.apache.tools.ant.taskdefs.optional.net.FTPimage=org.apache.tools.ant.taskdefs.optional.image.Imageiplanet-ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTaskjarlib-available=org.apache.tools.ant.taskdefs.optional.extension.JarLibAvailableTaskjarlib-display=org.apache.tools.ant.taskdefs.optional.extension.JarLibDisplayTaskjarlib-manifest=org.apache.tools.ant.taskdefs.optional.extension.JarLibManifestTaskjarlib-resolve=org.apache.tools.ant.taskdefs.optional.extension.JarLibResolveTaskjavacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCCjavah=org.apache.tools.ant.taskdefs.optional.Javahjdepend=org.apache.tools.ant.taskdefs.optional.jdepend.JDependTaskjjdoc=org.apache.tools.ant.taskdefs.optional.javacc.JJDocjjtree=org.apache.tools.ant.taskdefs.optional.javacc.JJTreejunit=org.apache.tools.ant.taskdefs.optional.junit.JUnitTaskjunitreport=org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregatornative2ascii=org.apache.tools.ant.taskdefs.optional.Native2Asciinetrexxc=org.apache.tools.ant.taskdefs.optional.NetRexxCpropertyfile=org.apache.tools.ant.taskdefs.optional.PropertyFilepvcs=org.apache.tools.ant.taskdefs.optional.pvcs.Pvcsreplaceregexp=org.apache.tools.ant.taskdefs.optional.ReplaceRegExprexec=org.apache.tools.ant.taskdefs.optional.net.RExecTaskrpm=org.apache.tools.ant.taskdefs.optional.Rpmschemavalidate=org.apache.tools.ant.taskdefs.optional.SchemaValidatescp=org.apache.tools.ant.taskdefs.optional.ssh.Scpscript=org.apache.tools.ant.taskdefs.optional.Scriptscriptdef=org.apache.tools.ant.taskdefs.optional.script.ScriptDefserverdeploy=org.apache.tools.ant.taskdefs.optional.j2ee.ServerDeploysetproxy=org.apache.tools.ant.taskdefs.optional.net.SetProxysoscheckin=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckinsoscheckout=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckoutsosget=org.apache.tools.ant.taskdefs.optional.sos.SOSGetsoslabel=org.apache.tools.ant.taskdefs.optional.sos.SOSLabelsound=org.apache.tools.ant.taskdefs.optional.sound.SoundTasksplash=org.apache.tools.ant.taskdefs.optional.splash.SplashTasksshexec=org.apache.tools.ant.taskdefs.optional.ssh.SSHExecsshsession=org.apache.tools.ant.taskdefs.optional.ssh.SSHSessionsymlink=org.apache.tools.ant.taskdefs.optional.unix.Symlinktelnet=org.apache.tools.ant.taskdefs.optional.net.TelnetTasktranslate=org.apache.tools.ant.taskdefs.optional.i18n.Translateverifyjar=org.apache.tools.ant.taskdefs.VerifyJarvssadd=org.apache.tools.ant.taskdefs.optional.vss.MSVSSADDvsscheckin=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKINvsscheckout=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUTvsscp=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCPvsscreate=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCREATEvssget=org.apache.tools.ant.taskdefs.optional.vss.MSVSSGETvsshistory=org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORYvsslabel=org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABELwljspc=org.apache.tools.ant.taskdefs.optional.jsp.WLJspcxmlvalidate=org.apache.tools.ant.taskdefs.optional.XMLValidateTask  # deprecated ant tasks (kept for back compatibility)copydir=org.apache.tools.ant.taskdefs.Copydircopyfile=org.apache.tools.ant.taskdefs.Copyfilecopypath=org.apache.tools.ant.taskdefs.CopyPathdeltree=org.apache.tools.ant.taskdefs.Deltreeexecon=org.apache.tools.ant.taskdefs.ExecuteOnjavadoc2=org.apache.tools.ant.taskdefs.Javadocjlink=org.apache.tools.ant.taskdefs.optional.jlink.JlinkTaskjspc=org.apache.tools.ant.taskdefs.optional.jsp.JspCmimemail=org.apache.tools.ant.taskdefs.optional.net.MimeMailrename=org.apache.tools.ant.taskdefs.Renamerenameext=org.apache.tools.ant.taskdefs.optional.RenameExtensionsstyle=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

 

从源码角度深入分析ant