Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

Ant 之(三) 关于Ant中Task的执行原理实例说明(持续中...)

前言:Ant工具是采用纯Java语言编写的一款自动化构建、编译、部署的工具,与Apache基金组织下的Maven工具类似,只是Maven后来的一些新功能,使得Maven比Ant工具更加优秀。至于Ant工具的安装和配置请查看本人其他相关的文档,在此不再赘述。

注:本章博客的测试系统为windows系统。

一、ANT的安装目录及环境变量的配置:

         安装目录:D:\Program Files\apache-ant-1.7.1

         环境变量:变量名:ANT_HOME;变量值:D:\Program Files\apache-ant-1.7.1

         将ANT_HOME加入PATH即可。

二、ANT工具在DOS命令下执行测试:

         A、建立测试用的build.xml文件,该文件放置在F盘下:

            Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

               我们的目标是在 F 盘下建立一个名叫“testMKDir”的测试目录。

         B、在DOS窗口中执行build.xml文件:

                Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

                我们可以从DOS窗口中看到,执行ANT命令的结果是成功的。那么我们在F盘下是不是成功建立了该脚本呢?去看一下,结果如图:

                Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

               从图中红色的地方可以看出,我们已经创建文件夹成功了。说明跟前面的执行结果反馈是一致的。

         C、将ANT的命令执行转变为Java类执行:

                C1:目标:在F盘下创建“testMKDir2”目录名称;

                C2:我们打开ANT工具的Java源代码,发现所有的Ant命令的Task定义都在org.apache.tools.ant.taskdefs包;

                C3:打开ANT工具的org.apache.tools.ant.taskdefs.Mkdir类,有一个方法叫execute(),其实如果你看得多的话,发现所有的Task都含义这个方法,如图所示:

                         Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

                C4:每个Task都继承于一个基类Task类,下面我们编写一个Java方法,看看能不能实现与ANT命令执行取得一样的结果;

                         Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

                         从图中的控制台,我们可以知道,程序为我们在F盘下创建了一个名叫“F://testMKDir2”的目录。去F盘看一下,如图所示:

                         Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

                         从图中看出,确实给我们创建了一个名叫“F://testMKDir2”的文件夹。

                         Java创建执行和我们执行Ant命令得到的结果是一致的,达到我们预测的效果。

         D、推测build.xml执行过程如下:

                以解析<mkdir dir = "F://testMKDir" />为例:

                1、解析到了mkdir任务,应该就是执行对应的Java类:org.apache.tools.ant.taskdefs.Mkdir;

                2、通过反射创建org.apache.tools.ant.taskdefs.Mkdir对象;

                3、获取其属性比如File(该属性你可以在Ant的源码中找到);

                4、根据属性设置方法setDir(File dir)(该方法你可以在Ant的源码中找到);

                5、最后用其父类调用execute()方法(该方法你可以在Ant的源码中找到);

                那么有什么根据说明执行mkdir任务的时候就是执行的Mkdir类呢?按照常理来讲,是否是应该有一个相应的映射关系呢?类似

                mkdir = org.apache.tools.ant.taskdefs.Mkdir;

                delete = org.apache.tools.ant.taskdefs.Delete;

                这样的关系到底存不存在,我们来看ant.jar包下的org.apache.tools.ant.taskdefs下的defaults.properties属性文件,如图所示:

                Ant 之(3) 关于Ant中Task的执行原理实例说明(持续中.)

                这张图片是为了证明我们上面的推测截取的一部分映射关系代码,说明我猜测的没有问题。