Ant的实现原理

来源:互联网 发布:java中md5加密怎么写 编辑:程序博客网 时间:2024/04/30 12:47

在build.xml中,我们使用一句简单的脚本就可以执行想要做的事情,比如说:

<delete dir="d://testMKDir" />

上面这句脚本将删除 d://testMKDir

很神奇,有木有?

想知道怎么实现的吗?

继续往下看....

将ant.jar反编译一下,我看看到如下东东:

 Ant结构

原来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版,其他版本应该也差不多..

原创粉丝点击