zoukankan      html  css  js  c++  java
  • Ant的实现原理

    在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:\testMKDir
    Deleting 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
      1 # Licensed to the Apache Software Foundation (ASF) under one or more
      2 # contributor license agreements.  See the NOTICE file distributed with
      3 # this work for additional information regarding copyright ownership.
      4 # The ASF licenses this file to You under the Apache License, Version 2.0
      5 # (the "License"); you may not use this file except in compliance with
      6 # the License.  You may obtain a copy of the License at
      7 #
      8 #     http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 # standard ant tasks
     17 ant=org.apache.tools.ant.taskdefs.Ant
     18 antcall=org.apache.tools.ant.taskdefs.CallTarget
     19 antstructure=org.apache.tools.ant.taskdefs.AntStructure
     20 antversion=org.apache.tools.ant.taskdefs.condition.AntVersion
     21 apply=org.apache.tools.ant.taskdefs.Transform
     22 available=org.apache.tools.ant.taskdefs.Available
     23 basename=org.apache.tools.ant.taskdefs.Basename
     24 buildnumber=org.apache.tools.ant.taskdefs.BuildNumber
     25 bunzip2=org.apache.tools.ant.taskdefs.BUnzip2
     26 bzip2=org.apache.tools.ant.taskdefs.BZip2
     27 checksum=org.apache.tools.ant.taskdefs.Checksum
     28 chmod=org.apache.tools.ant.taskdefs.Chmod
     29 classloader=org.apache.tools.ant.taskdefs.Classloader
     30 concat=org.apache.tools.ant.taskdefs.Concat
     31 condition=org.apache.tools.ant.taskdefs.ConditionTask
     32 copy=org.apache.tools.ant.taskdefs.Copy
     33 cvs=org.apache.tools.ant.taskdefs.Cvs
     34 cvschangelog=org.apache.tools.ant.taskdefs.cvslib.ChangeLogTask
     35 cvspass=org.apache.tools.ant.taskdefs.CVSPass
     36 cvstagdiff=org.apache.tools.ant.taskdefs.cvslib.CvsTagDiff
     37 cvsversion=org.apache.tools.ant.taskdefs.cvslib.CvsVersion
     38 defaultexcludes=org.apache.tools.ant.taskdefs.DefaultExcludes
     39 delete=org.apache.tools.ant.taskdefs.Delete
     40 dependset=org.apache.tools.ant.taskdefs.DependSet
     41 diagnostics=org.apache.tools.ant.taskdefs.DiagnosticsTask
     42 dirname=org.apache.tools.ant.taskdefs.Dirname
     43 ear=org.apache.tools.ant.taskdefs.Ear
     44 echo=org.apache.tools.ant.taskdefs.Echo
     45 exec=org.apache.tools.ant.taskdefs.ExecTask
     46 fail=org.apache.tools.ant.taskdefs.Exit
     47 filter=org.apache.tools.ant.taskdefs.Filter
     48 fixcrlf=org.apache.tools.ant.taskdefs.FixCRLF
     49 genkey=org.apache.tools.ant.taskdefs.GenerateKey
     50 get=org.apache.tools.ant.taskdefs.Get
     51 gunzip=org.apache.tools.ant.taskdefs.GUnzip
     52 gzip=org.apache.tools.ant.taskdefs.GZip
     53 import=org.apache.tools.ant.taskdefs.ImportTask
     54 input=org.apache.tools.ant.taskdefs.Input
     55 jar=org.apache.tools.ant.taskdefs.Jar
     56 java=org.apache.tools.ant.taskdefs.Java
     57 javac=org.apache.tools.ant.taskdefs.Javac
     58 javadoc=org.apache.tools.ant.taskdefs.Javadoc
     59 length=org.apache.tools.ant.taskdefs.Length
     60 loadfile=org.apache.tools.ant.taskdefs.LoadFile
     61 loadproperties=org.apache.tools.ant.taskdefs.LoadProperties
     62 loadresource=org.apache.tools.ant.taskdefs.LoadResource
     63 macrodef=org.apache.tools.ant.taskdefs.MacroDef
     64 mail=org.apache.tools.ant.taskdefs.email.EmailTask
     65 manifest=org.apache.tools.ant.taskdefs.ManifestTask
     66 manifestclasspath=org.apache.tools.ant.taskdefs.ManifestClassPath
     67 mkdir=org.apache.tools.ant.taskdefs.Mkdir
     68 move=org.apache.tools.ant.taskdefs.Move
     69 nice=org.apache.tools.ant.taskdefs.Nice
     70 parallel=org.apache.tools.ant.taskdefs.Parallel
     71 patch=org.apache.tools.ant.taskdefs.Patch
     72 pathconvert=org.apache.tools.ant.taskdefs.PathConvert
     73 presetdef=org.apache.tools.ant.taskdefs.PreSetDef
     74 property=org.apache.tools.ant.taskdefs.Property
     75 record=org.apache.tools.ant.taskdefs.Recorder
     76 replace=org.apache.tools.ant.taskdefs.Replace
     77 retry=org.apache.tools.ant.taskdefs.Retry
     78 rmic=org.apache.tools.ant.taskdefs.Rmic
     79 sequential=org.apache.tools.ant.taskdefs.Sequential
     80 signjar=org.apache.tools.ant.taskdefs.SignJar
     81 sleep=org.apache.tools.ant.taskdefs.Sleep
     82 sql=org.apache.tools.ant.taskdefs.SQLExec
     83 subant=org.apache.tools.ant.taskdefs.SubAnt
     84 sync=org.apache.tools.ant.taskdefs.Sync
     85 tar=org.apache.tools.ant.taskdefs.Tar
     86 taskdef=org.apache.tools.ant.taskdefs.Taskdef
     87 tempfile=org.apache.tools.ant.taskdefs.TempFile
     88 touch=org.apache.tools.ant.taskdefs.Touch
     89 tstamp=org.apache.tools.ant.taskdefs.Tstamp
     90 truncate=org.apache.tools.ant.taskdefs.Truncate
     91 typedef=org.apache.tools.ant.taskdefs.Typedef
     92 unjar=org.apache.tools.ant.taskdefs.Expand
     93 untar=org.apache.tools.ant.taskdefs.Untar
     94 unwar=org.apache.tools.ant.taskdefs.Expand
     95 unzip=org.apache.tools.ant.taskdefs.Expand
     96 uptodate=org.apache.tools.ant.taskdefs.UpToDate
     97 waitfor=org.apache.tools.ant.taskdefs.WaitFor
     98 war=org.apache.tools.ant.taskdefs.War
     99 whichresource=org.apache.tools.ant.taskdefs.WhichResource
    100 xmlproperty=org.apache.tools.ant.taskdefs.XmlProperty
    101 xslt=org.apache.tools.ant.taskdefs.XSLTProcess
    102 zip=org.apache.tools.ant.taskdefs.Zip
    103 
    104 # optional tasks
    105 antlr=org.apache.tools.ant.taskdefs.optional.ANTLR
    106 apt=org.apache.tools.ant.taskdefs.Apt
    107 attrib=org.apache.tools.ant.taskdefs.optional.windows.Attrib
    108 blgenclient=org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient
    109 cab=org.apache.tools.ant.taskdefs.optional.Cab
    110 cccheckin=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin
    111 cccheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout
    112 cclock=org.apache.tools.ant.taskdefs.optional.clearcase.CCLock
    113 ccmcheckin=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin
    114 ccmcheckintask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault
    115 ccmcheckout=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout
    116 ccmcreatetask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask
    117 ccmkattr=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkattr
    118 ccmkbl=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkbl
    119 ccmkdir=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkdir
    120 ccmkelem=org.apache.tools.ant.taskdefs.optional.clearcase.CCMkelem
    121 ccmklabel=org.apache.tools.ant.taskdefs.optional.clearcase.CCMklabel
    122 ccmklbtype=org.apache.tools.ant.taskdefs.optional.clearcase.CCMklbtype
    123 ccmreconfigure=org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure
    124 ccrmtype=org.apache.tools.ant.taskdefs.optional.clearcase.CCRmtype
    125 ccuncheckout=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout
    126 ccunlock=org.apache.tools.ant.taskdefs.optional.clearcase.CCUnlock
    127 ccupdate=org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate
    128 chgrp=org.apache.tools.ant.taskdefs.optional.unix.Chgrp
    129 chown=org.apache.tools.ant.taskdefs.optional.unix.Chown
    130 csc=org.apache.tools.ant.taskdefs.optional.dotnet.CSharp
    131 ddcreator=org.apache.tools.ant.taskdefs.optional.ejb.DDCreator
    132 depend=org.apache.tools.ant.taskdefs.optional.depend.Depend
    133 echoproperties=org.apache.tools.ant.taskdefs.optional.EchoProperties
    134 echoxml=org.apache.tools.ant.taskdefs.EchoXML
    135 ejbc=org.apache.tools.ant.taskdefs.optional.ejb.Ejbc
    136 ejbjar=org.apache.tools.ant.taskdefs.optional.ejb.EjbJar
    137 ftp=org.apache.tools.ant.taskdefs.optional.net.FTP
    138 ilasm=org.apache.tools.ant.taskdefs.optional.dotnet.Ilasm
    139 ildasm=org.apache.tools.ant.taskdefs.optional.dotnet.Ildasm
    140 image=org.apache.tools.ant.taskdefs.optional.image.Image
    141 importtypelib=org.apache.tools.ant.taskdefs.optional.dotnet.ImportTypelib
    142 iplanet-ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask
    143 jarlib-available=org.apache.tools.ant.taskdefs.optional.extension.JarLibAvailableTask
    144 jarlib-display=org.apache.tools.ant.taskdefs.optional.extension.JarLibDisplayTask
    145 jarlib-manifest=org.apache.tools.ant.taskdefs.optional.extension.JarLibManifestTask
    146 jarlib-resolve=org.apache.tools.ant.taskdefs.optional.extension.JarLibResolveTask
    147 javacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCC
    148 javah=org.apache.tools.ant.taskdefs.optional.Javah
    149 jdepend=org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask
    150 jjdoc=org.apache.tools.ant.taskdefs.optional.javacc.JJDoc
    151 jjtree=org.apache.tools.ant.taskdefs.optional.javacc.JJTree
    152 jsharpc=org.apache.tools.ant.taskdefs.optional.dotnet.JSharp
    153 junit=org.apache.tools.ant.taskdefs.optional.junit.JUnitTask
    154 junitreport=org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator
    155 makeurl=org.apache.tools.ant.taskdefs.MakeUrl
    156 native2ascii=org.apache.tools.ant.taskdefs.optional.Native2Ascii
    157 netrexxc=org.apache.tools.ant.taskdefs.optional.NetRexxC
    158 p4add=org.apache.tools.ant.taskdefs.optional.perforce.P4Add
    159 p4change=org.apache.tools.ant.taskdefs.optional.perforce.P4Change
    160 p4counter=org.apache.tools.ant.taskdefs.optional.perforce.P4Counter
    161 p4delete=org.apache.tools.ant.taskdefs.optional.perforce.P4Delete
    162 p4edit=org.apache.tools.ant.taskdefs.optional.perforce.P4Edit
    163 p4fstat=org.apache.tools.ant.taskdefs.optional.perforce.P4Fstat
    164 p4have=org.apache.tools.ant.taskdefs.optional.perforce.P4Have
    165 p4integrate=org.apache.tools.ant.taskdefs.optional.perforce.P4Integrate
    166 p4label=org.apache.tools.ant.taskdefs.optional.perforce.P4Label
    167 p4labelsync=org.apache.tools.ant.taskdefs.optional.perforce.P4Labelsync
    168 p4reopen=org.apache.tools.ant.taskdefs.optional.perforce.P4Reopen
    169 p4resolve=org.apache.tools.ant.taskdefs.optional.perforce.P4Resolve
    170 p4revert=org.apache.tools.ant.taskdefs.optional.perforce.P4Revert
    171 p4submit=org.apache.tools.ant.taskdefs.optional.perforce.P4Submit
    172 p4sync=org.apache.tools.ant.taskdefs.optional.perforce.P4Sync
    173 propertyfile=org.apache.tools.ant.taskdefs.optional.PropertyFile
    174 pvcs=org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs
    175 replaceregexp=org.apache.tools.ant.taskdefs.optional.ReplaceRegExp
    176 resourcecount=org.apache.tools.ant.taskdefs.ResourceCount
    177 rexec=org.apache.tools.ant.taskdefs.optional.net.RExecTask
    178 rpm=org.apache.tools.ant.taskdefs.optional.Rpm
    179 schemavalidate=org.apache.tools.ant.taskdefs.optional.SchemaValidate
    180 scp=org.apache.tools.ant.taskdefs.optional.ssh.Scp
    181 script=org.apache.tools.ant.taskdefs.optional.Script
    182 scriptdef=org.apache.tools.ant.taskdefs.optional.script.ScriptDef
    183 serverdeploy=org.apache.tools.ant.taskdefs.optional.j2ee.ServerDeploy
    184 setproxy=org.apache.tools.ant.taskdefs.optional.net.SetProxy
    185 soscheckin=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin
    186 soscheckout=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout
    187 sosget=org.apache.tools.ant.taskdefs.optional.sos.SOSGet
    188 soslabel=org.apache.tools.ant.taskdefs.optional.sos.SOSLabel
    189 sound=org.apache.tools.ant.taskdefs.optional.sound.SoundTask
    190 splash=org.apache.tools.ant.taskdefs.optional.splash.SplashTask
    191 sshexec=org.apache.tools.ant.taskdefs.optional.ssh.SSHExec
    192 stcheckin=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckin
    193 stcheckout=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout
    194 stlabel=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamLabel
    195 stlist=org.apache.tools.ant.taskdefs.optional.starteam.StarTeamList
    196 stylebook=org.apache.tools.ant.taskdefs.optional.StyleBook
    197 symlink=org.apache.tools.ant.taskdefs.optional.unix.Symlink
    198 telnet=org.apache.tools.ant.taskdefs.optional.net.TelnetTask
    199 translate=org.apache.tools.ant.taskdefs.optional.i18n.Translate
    200 vbc=org.apache.tools.ant.taskdefs.optional.dotnet.VisualBasicCompile
    201 verifyjar=org.apache.tools.ant.taskdefs.VerifyJar
    202 vssadd=org.apache.tools.ant.taskdefs.optional.vss.MSVSSADD
    203 vsscheckin=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN
    204 vsscheckout=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT
    205 vsscp=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCP
    206 vsscreate=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCREATE
    207 vssget=org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET
    208 vsshistory=org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY
    209 vsslabel=org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL
    210 wljspc=org.apache.tools.ant.taskdefs.optional.jsp.WLJspc
    211 wlrun=org.apache.tools.ant.taskdefs.optional.ejb.WLRun
    212 wlstop=org.apache.tools.ant.taskdefs.optional.ejb.WLStop
    213 wsdltodotnet=org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet
    214 xmlvalidate=org.apache.tools.ant.taskdefs.optional.XMLValidateTask
    215 
    216 
    217 # deprecated ant tasks (kept for back compatibility)
    218 copydir=org.apache.tools.ant.taskdefs.Copydir
    219 copyfile=org.apache.tools.ant.taskdefs.Copyfile
    220 copypath=org.apache.tools.ant.taskdefs.CopyPath
    221 deltree=org.apache.tools.ant.taskdefs.Deltree
    222 execon=org.apache.tools.ant.taskdefs.ExecuteOn
    223 javadoc2=org.apache.tools.ant.taskdefs.Javadoc
    224 jlink=org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask
    225 jspc=org.apache.tools.ant.taskdefs.optional.jsp.JspC
    226 mimemail=org.apache.tools.ant.taskdefs.optional.net.MimeMail
    227 rename=org.apache.tools.ant.taskdefs.Rename
    228 renameext=org.apache.tools.ant.taskdefs.optional.RenameExtensions
    229 starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut
    230 style=org.apache.tools.ant.taskdefs.XSLTProcess
    231 WsdlToDotnet=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版,其他版本应该也差不多..

  • 相关阅读:
    子类构造函数中调用虚函数问题验证
    socks5代理浅识
    关于C++标准库(第2版)std::remove_if的"特性"概述
    动态获取结构体中指定的属性值
    构造和析构函数定义为私有场景
    remove_pointer使用测验
    广播自定义消息实现进程间的通信问题
    遍历窗口权限问题
    嵌入窗口到桌面的问题
    实验一 熟悉实验环境
  • 原文地址:https://www.cnblogs.com/yejg1212/p/2959689.html
Copyright © 2011-2022 走看看