Apache Ant中任务(Task)的执行原理实例说明
2014-03-26 23:20
281 查看
前言: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盘下:
我们的目标是在 F 盘下建立一个名叫“testMKDir”的测试目录。
B、在DOS窗口中执行build.xml文件:
我们可以从DOS窗口中看到,执行ANT命令的结果是成功的。那么我们在F盘下是不是成功建立了该脚本呢?去看一下,结果如图:
从图中红色的地方可以看出,我们已经创建文件夹成功了。说明跟前面的执行结果反馈是一致的。
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都含义这个方法,如图所示:
C4:每个Task都继承于一个基类Task类,下面我们编写一个Java方法,看看能不能实现与ANT命令执行取得一样的结果;
从图中的控制台,我们可以知道,程序为我们在F盘下创建了一个名叫“F://testMKDir2”的目录。去F盘看一下,如图所示:
从图中看出,确实给我们创建了一个名叫“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的Task过程中调用了这种映射关系呢?我们可以采取下面的方式,即第 E 步骤:
E、验证我们在第 D 步骤的推测是否正确:
E1:采用解压缩工具并将defaults.properties文件中的mkdir=org.apache.tools.ant.taskdefs.Mkdir修改成mkdir1=org.apache.tools.ant.taskdefs.Mkdir;
E2:在DOS命令窗口利用ANT命令重新执行build.xml文件,结果如图;
从图中我们可以知道,我们执行失败了,原因是“Cause: The name is undefined.”,意思是我们执行的build.xml中的Task任务名称没有定义,说明在执行的过程中,已经找不到所谓的映射关系“mkdir=org.apache.tools.ant.taskdefs.Mkdir”了。
E3:我们将build.xml文件中<mkdirdir="F://testMKDir"/>标签替换成<mkdir1dir="F://testMKDir"/>;
E4:在DOS命令窗口利用ANT命令重新执行build.xml文件,结果如图;
从图中可以看出,我们执行的ANT命令时成功的,同时我们在 F 盘下面也看到了我们的新建目录。
E5:整个 E 步骤验证了我们执行的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盘下:
我们的目标是在 F 盘下建立一个名叫“testMKDir”的测试目录。
B、在DOS窗口中执行build.xml文件:
我们可以从DOS窗口中看到,执行ANT命令的结果是成功的。那么我们在F盘下是不是成功建立了该脚本呢?去看一下,结果如图:
从图中红色的地方可以看出,我们已经创建文件夹成功了。说明跟前面的执行结果反馈是一致的。
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都含义这个方法,如图所示:
C4:每个Task都继承于一个基类Task类,下面我们编写一个Java方法,看看能不能实现与ANT命令执行取得一样的结果;
从图中的控制台,我们可以知道,程序为我们在F盘下创建了一个名叫“F://testMKDir2”的目录。去F盘看一下,如图所示:
从图中看出,确实给我们创建了一个名叫“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的Task过程中调用了这种映射关系呢?我们可以采取下面的方式,即第 E 步骤:
E、验证我们在第 D 步骤的推测是否正确:
E1:采用解压缩工具并将defaults.properties文件中的mkdir=org.apache.tools.ant.taskdefs.Mkdir修改成mkdir1=org.apache.tools.ant.taskdefs.Mkdir;
E2:在DOS命令窗口利用ANT命令重新执行build.xml文件,结果如图;
从图中我们可以知道,我们执行失败了,原因是“Cause: The name is undefined.”,意思是我们执行的build.xml中的Task任务名称没有定义,说明在执行的过程中,已经找不到所谓的映射关系“mkdir=org.apache.tools.ant.taskdefs.Mkdir”了。
E3:我们将build.xml文件中<mkdirdir="F://testMKDir"/>标签替换成<mkdir1dir="F://testMKDir"/>;
E4:在DOS命令窗口利用ANT命令重新执行build.xml文件,结果如图;
从图中可以看出,我们执行的ANT命令时成功的,同时我们在 F 盘下面也看到了我们的新建目录。
E5:整个 E 步骤验证了我们执行的ANT命令时,依赖相应的映射关系的推测是正确的。
相关文章推荐
- 关于Java Web 使用Java的TimerTask, 触发定时器(执行某些任务)的实例
- linux下定时执行任务的方法 crontab 用法说明
- Windows中使用计划任务自动执行PHP程序实例
- linux下定时执行任务的方法 crontab 用法说明
- 8.4.2 ResultTask执行结果与Driver的交互原理及源码详解
- Spring-task运行时修改任务执行周期
- 解决Spring定时计划任务重复执行两次(实例被构造两次)问题的方法
- MySQL定时执行脚本(计划任务)命令实例
- 设定指定任务task在指定时间time执行 schedule(TimerTask task, Date time)
- Django Celery Redis 异步执行任务demo实例
- spring中集成TimerTask执行定时任务
- WINDOWS == Django Celery Redis 异步执行任务demo实例
- Hadoop MapReduce之ReduceTask任务执行(二):GetMapEventsThread线程
- Activiti 流程实例、任务的执行
- 实例学习ansible系列(2)从Helloworld深度解析Ansible执行原理
- Asp.Net(C#)自动执行计划任务的程序实例分析分享
- task-DelayQueue-订单超时实例(task任务,DelayQueue阻塞队列)
- 利用 spring 的 task:scheduled-tasks 执行定期任务
- java中任务调度java.util.Timer,ScheduledExecutor,Quartz的机制说明和demo代码实例分享
- 【转】spring Mvc 执行原理 及 xml注解配置说明