首页 > 代码库 > 从源码角度深入分析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解析配置文件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 编译器, 参见 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
发送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