Ant的实现原理
来源:互联网 发布:java中md5加密怎么写 编辑:程序博客网 时间:2024/04/30 12:47
在build.xml中,我们使用一句简单的脚本就可以执行想要做的事情,比如说:
<delete dir="d://testMKDir" />
上面这句脚本将删除 d://testMKDir
很神奇,有木有?
想知道怎么实现的吗?
继续往下看....
将ant.jar反编译一下,我看看到如下东东:
原来ant将这些操作都封装了起来。这些操作都有一个共通的基类叫Task(抽象类)。
public void execute() throws BuildException{}
其中有个空实现的execute方法,为什么提这个,后面你就知道了。
下面来测试一下:
/* * <delete dir="d://testMKDir" /> * <mkdir dir="d://testMKDir" /> * delete=org.apache.tools.ant.taskdefs.Delete * mkdir=org.apache.tools.ant.taskdefs.Mkdir */public static void execute(String obj, String path) { try { Method setMethod = null; Class classObj = Class.forName(obj); Object objectCopy = classObj.getConstructor(new Class[] {}) .newInstance(new Object[] {}); setMethod = classObj.getMethod("setDir", new Class[] { File.class }); setMethod.invoke(objectCopy, new File(path)); Task task = (Task) objectCopy; task.execute(); } catch (Exception e) { System.out.println(e); } }
调用上面的方法:
execute("org.apache.tools.ant.taskdefs.Mkdir", "d://testMKDir");execute("org.apache.tools.ant.taskdefs.Delete", "d://testMKDir");
执行之后,控制台输出:
Created dir: d:\testMKDirDeleting directory d:\testMKDir
由上可知,build.xml中的执行过程大致为:
以解析<mkdir dir = "d://testMKDir" />为例:
- 解析到了mkdir,就根据属性文件defaults.properties查找到: mkdir=org.apache.tools.ant.taskdefs.Mkdir
- 通过反射创建org.apache.tools.ant.taskdefs.Mkdir对象
- 获取其属性比如File dir;
- 根据属性设置方法setDir(File dir);
- 最后用其父类调用execute()方法
defaults.properties文件在org.apache.tools.ant.types包下,内容如下:
defaults.properties# Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements. See the NOTICE file distributed with# this work for additional information regarding copyright ownership.# The ASF licenses this file to You under the Apache License, Version 2.0# (the "License"); you may not use this file except in compliance with# the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.## 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.Transformavailable=org.apache.tools.ant.taskdefs.Availablebasename=org.apache.tools.ant.taskdefs.Basenamebuildnumber=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.Classloaderconcat=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.Echoexec=org.apache.tools.ant.taskdefs.ExecTaskfail=org.apache.tools.ant.taskdefs.Exitfilter=org.apache.tools.ant.taskdefs.Filterfixcrlf=org.apache.tools.ant.taskdefs.FixCRLFgenkey=org.apache.tools.ant.taskdefs.GenerateKeyget=org.apache.tools.ant.taskdefs.Getgunzip=org.apache.tools.ant.taskdefs.GUnzipgzip=org.apache.tools.ant.taskdefs.GZipimport=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.LoadResourcemacrodef=org.apache.tools.ant.taskdefs.MacroDefmail=org.apache.tools.ant.taskdefs.email.EmailTaskmanifest=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.PreSetDefproperty=org.apache.tools.ant.taskdefs.Propertyrecord=org.apache.tools.ant.taskdefs.Recorderreplace=org.apache.tools.ant.taskdefs.Replaceretry=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.ANTLRapt=org.apache.tools.ant.taskdefs.Aptattrib=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.Chowncsc=org.apache.tools.ant.taskdefs.optional.dotnet.CSharpddcreator=org.apache.tools.ant.taskdefs.optional.ejb.DDCreatordepend=org.apache.tools.ant.taskdefs.optional.depend.Dependechoproperties=org.apache.tools.ant.taskdefs.optional.EchoPropertiesechoxml=org.apache.tools.ant.taskdefs.EchoXMLejbc=org.apache.tools.ant.taskdefs.optional.ejb.Ejbcejbjar=org.apache.tools.ant.taskdefs.optional.ejb.EjbJarftp=org.apache.tools.ant.taskdefs.optional.net.FTPilasm=org.apache.tools.ant.taskdefs.optional.dotnet.Ilasmildasm=org.apache.tools.ant.taskdefs.optional.dotnet.Ildasmimage=org.apache.tools.ant.taskdefs.optional.image.Imageimporttypelib=org.apache.tools.ant.taskdefs.optional.dotnet.ImportTypelibiplanet-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.JJTreejsharpc=org.apache.tools.ant.taskdefs.optional.dotnet.JSharpjunit=org.apache.tools.ant.taskdefs.optional.junit.JUnitTaskjunitreport=org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregatormakeurl=org.apache.tools.ant.taskdefs.MakeUrlnative2ascii=org.apache.tools.ant.taskdefs.optional.Native2Asciinetrexxc=org.apache.tools.ant.taskdefs.optional.NetRexxCp4add=org.apache.tools.ant.taskdefs.optional.perforce.P4Addp4change=org.apache.tools.ant.taskdefs.optional.perforce.P4Changep4counter=org.apache.tools.ant.taskdefs.optional.perforce.P4Counterp4delete=org.apache.tools.ant.taskdefs.optional.perforce.P4Deletep4edit=org.apache.tools.ant.taskdefs.optional.perforce.P4Editp4fstat=org.apache.tools.ant.taskdefs.optional.perforce.P4Fstatp4have=org.apache.tools.ant.taskdefs.optional.perforce.P4Havep4integrate=org.apache.tools.ant.taskdefs.optional.perforce.P4Integratep4label=org.apache.tools.ant.taskdefs.optional.perforce.P4Labelp4labelsync=org.apache.tools.ant.taskdefs.optional.perforce.P4Labelsyncp4reopen=org.apache.tools.ant.taskdefs.optional.perforce.P4Reopenp4resolve=org.apache.tools.ant.taskdefs.optional.perforce.P4Resolvep4revert=org.apache.tools.ant.taskdefs.optional.perforce.P4Revertp4submit=org.apache.tools.ant.taskdefs.optional.perforce.P4Submitp4sync=org.apache.tools.ant.taskdefs.optional.perforce.P4Syncpropertyfile=org.apache.tools.ant.taskdefs.optional.PropertyFilepvcs=org.apache.tools.ant.taskdefs.optional.pvcs.Pvcsreplaceregexp=org.apache.tools.ant.taskdefs.optional.ReplaceRegExpresourcecount=org.apache.tools.ant.taskdefs.ResourceCountrexec=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.SSHExecstcheckin=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckinstcheckout=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckoutstlabel=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamLabelstlist=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamListstylebook=org.apache.tools.ant.taskdefs.optional.StyleBooksymlink=org.apache.tools.ant.taskdefs.optional.unix.Symlinktelnet=org.apache.tools.ant.taskdefs.optional.net.TelnetTasktranslate=org.apache.tools.ant.taskdefs.optional.i18n.Translatevbc=org.apache.tools.ant.taskdefs.optional.dotnet.VisualBasicCompileverifyjar=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.WLJspcwlrun=org.apache.tools.ant.taskdefs.optional.ejb.WLRunwlstop=org.apache.tools.ant.taskdefs.optional.ejb.WLStopwsdltodotnet=org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnetxmlvalidate=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.RenameExtensionsstarteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOutstyle=org.apache.tools.ant.taskdefs.XSLTProcessWsdlToDotnet=org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet
类似的,测试一下copy方法如下
public static void execute_Copy(String obj, String path,String destPath) { try { Method setMethod = null; Method setDestMethod = null; Class classObj = Class.forName(obj); Object objectCopy = classObj.getConstructor(new Class[] {}) .newInstance(new Object[] {}); setMethod = classObj.getMethod("setFile", new Class[] { File.class }); setMethod.invoke(objectCopy, new File(path)); setDestMethod = classObj.getMethod("setTofile", new Class[] { File.class }); setDestMethod.invoke(objectCopy, new File(destPath)); Task task = (Task) objectCopy; task.execute(); } catch (Exception e) { System.out.println(e); } }
以上测试基于ant 1.7版,其他版本应该也差不多..
- Ant的实现原理
- ant 原理
- 蚁群算法ACO(ant colony optimization)的原理以及实现源代码
- 蚁群算法ACO(ant colony optimization)的原理以及实现源代码(转)
- ant.jar 包实现的压缩类
- ant实现Java的编译和运行
- ant脚本实现的Android自动编译
- Ant中调用Maven的实现方法
- Ant自动打包、多渠道打包的实现
- Ant 概念 原理 实例
- ant标签和原理
- Apache Ant中任务(Task)的执行原理实例说明
- ant的ant任务
- Shiro -Ant 风格的匹配URL的实现源码,以及Ant风格
- 使用SVN+CruiseControl+ANT实现持续集成之一----持续集成概念及CC原理介绍
- 使用SVN+CruiseControl+ANT实现持续集成之一持续集成概念及CC原理介绍
- 使用SVN+CruiseControl+ANT实现持续集成之一----持续集成概念及CC原理介绍
- Ant详解(用Ant实现Java项目的自动构建和部署)
- Lisp语言发明者 人工智能奠基人 John McCarthy
- OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows,
- HDU4772--Zhuge Liang's Password(160)
- android 测试分享图片+文字到微博
- UNIX / Linux: 10 Netstat Command Examples
- Ant的实现原理
- android游戏物理引擎开发——重力引擎(一)
- 用PhysicsEditor快速创建自定义Box2D刚体
- 我们了解SEO,一定要有一个正确的认识
- 回文 反序 素数
- Ping Tutorial: 15 Effective Ping Command Examples
- HDU - 4527 小明系列故事――玩转十滴水
- The Ultimate Wget Download Guide With 15 Awesome Examples
- 使用MVC结构