从源码角度深入分析 ant
[转自] http://www.tuicool.com/articles/eQvIRbA
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压缩一组文件
Jlink过期的. 使用jar或者zip task中的zipfileset和zipgroupfileset属性替代.
Manifest
创建一个mainifest文件
Rpm
激活可以执行的rpm命令来构建一个linux的安装文件。这个task目前仅使用在rpm支持的linux或者unix平台。
SignJar
使用javasign命令行工具来给一个jar或者zip文件进行加签。
Unjar
解压一个jar文件
War
jar task的扩展,以web应用文件格式压缩WEB-INF/lib,WEB-INF/classs等文件
2. Audit/Coverage Tasks
JDepend :触发一个JDepend 解析器。这个解析器变量一组java源文件目录,产生符合设置标准的java包。
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.)
ServerDeploy
针对特定的J2EE服务器,运行热部署的task
5. Documentation Tasks
Javadoc/Javadoc2
使用javadoc工具产生一个代码文件。javadoc2已经过期,使用javadoc task替换。
6. EJB Tasks
(参见关于EJB 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
当一组特定条件满足时阻塞执行。
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的位置放到特定的属性中。
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文件是否有效。
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处理一组文档。
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文件中加载属性值。
FTP
集成了基本的ftp客户端功能,实现发送,接受,列举,删除文件,创建文件的功能。
Rexec
自动创建一个远程重执行回话的task。
Scp
使用ssh从一个远程服务器读取或者写入文件。
setproxy
设置java web的代理属性,从而运行在同一个虚拟机上的代码和任务可以穿越防火墙访问远程的web站点。
Sshexec
使用ssh在远程服务器上执行excute命令
Telnet
自动连接一个远程telnet回话的task,这个task使用嵌套的<read>和<write>标签接收字符 串和发送字符串。
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。
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
从源码角度深入分析 ant的更多相关文章
- 从源码角度深入分析ant
Ant的基本概念 首先是ant的基本概念:Project,Target,Tasks,Properties,Paths 1.Project <project> build.xml文件最顶层的 ...
- 从源码角度深入分析log4j配置文件使用
log4j在日常开发中经常使用,但有时候对 配置文件应该放到什么位置有疑惑.现在我们通过从代码的角度来看待这个问题, 看完后你也许会恍然大悟哦. 开始吧. Log4j的组成及架构: Log4j由三个重 ...
- 从源码角度深入理解Toast
Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(", Toast.LENGTH_LONG).show(); 但是我们经常会遇到这 ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(二)
1,接着我们上一篇继续介绍,在上一篇我们介绍了简单的@Inject和@Component的结合使用,现在我们继续以老师和学生的例子,我们知道学生上课的时候都会有书籍来辅助听课,先来看看我们之前的Stu ...
- 从源码角度入手实现RecyclerView的Item点击事件
RecyclerView 作为 ListView 和 GridView 的替代产物,相信在Android界已广为流传. RecyclerView 本是不会有类似 ListView 的那种点击事件,但是 ...
- 从template到DOM(Vue.js源码角度看内部运行机制)
写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(https://github.com/answershuto/learnVue)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些 ...
- Android布局性能优化—从源码角度看ViewStub延迟加载技术
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码 ...
- Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质
上篇文章我们讲日志的存储策略的时候用到了HandlerThread,它适合处理"多而小的任务"的耗时任务的时候,避免产生太多线程影响性能,那这个HandlerThread的原理到底 ...
随机推荐
- Django--form保存用户输入内容
需求 用户提交form时,如果报错,页面中的用户信息还在(除了密码),没有被刷新掉,不用用户再次输入. 速查 views.py 1 2 3 def login(request): obj = ...
- 跨域问题hbuilder
1.借助jquery-jsonp插件 $.jsonp({ url: url, data: { 'name': usd, 'passwd': pass }, callbackParameter: &qu ...
- css总结11:css的overflow问题
1 排版时经常遇到块级元素内容overflow,怎么妥当处理是一个关键. overflow的常用属性: 代码: <!DOCTYPE html><html lang="en ...
- (转)那天有个小孩教我WCF[一][1/3]
原文地址:http://www.cnblogs.com/AaronYang/p/2950931.html 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不 ...
- 转Delphi中XLSReadWrite控件的使用(3) 读和写Excel
unit OpExcell; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo ...
- 使用Sencha Cmd创建脚本框架
从Ext JS 4.1.1a 开始,为了配合 Sencha Touch开发 而设计了 Sencha Cmd这个跨平台的命令行工具. 要使用Sencha Cmd,必须先安装好 Java Run-tim ...
- 观察者(Observer)模式 * 委托事件
观察者(Observer)模式:定义了一种一对多的依赖关系.让多个观察者对象同时监听某一个主题对象. 这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己 /* * 抽象主题(Subje ...
- 模板方法(Template Method)模式
/* * 抽象模版(AbstractClass)角色有如下的责任: 定义了一个或多个抽象操作,以便让子类实现.这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤. 定义并实现了一个模版方法.这个模 ...
- OpenResty 最佳实践 (2)
此文已由作者汤晓静授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. lua 协程与 nginx 事件机制结合 文章前部分用大量篇幅阐述了 lua 和 nginx 的相关知识,包 ...
- 「POJ 1741」Tree
题面: Tree Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define ...