转: Ant 脚本的结构化设计
引言
Ant 脚本是由 Apache 提供的一种基于 Java 的构建工具,为 Java 开发人员所熟悉。Java 开发人员使用 Ant 脚本可以很方便地完成 Java 开发过程中常见的如拷贝文件、创建目录、编译、打包、压缩文件等等重复性的工作,从而提高开发效率,减轻开发人员负担,达到提高开发质量的目的。
Ant 既然是一种脚本语言,那么如何才能结构化设计 Ant 脚本, 从而使 Ant 脚本更易维护、更易扩展、更易重用,本文将就此目的做一些探讨。
使用 Ant generic target
在 Ant 中有 target(目标)和 task(任务)两个概念,一个 target 是 task 的容器,它可以包含一个或者多个任务,它们之间是一对多的关系。任务的例子有拷贝文件、创建目录等等。
在日常的开发过程中,经常会有一些经常重复的事情,对于这些事情我们可以定义一个 target 作为一个通用的 target,即 generic target, 它带有一些参数,这些参数由调用者在调用这个 generic target 时给定。别的 target 可以使用 antcall 任务去调用这个 generic target, 从而达到重用的目的。我们来看一个例子 , 比如说,调用一个 SQL 脚本文件,那么我们可以按照清单 1 构造一个 generic target:
清单 1. 调用 SQL 脚本的 run.sqlscript
<target name="run.sqlscript">
<sql driver="${driver.name}" url="${jdbc.url}" userid="${user.name}"
password="${user.password}" expandProperties="true">
<classpath refid="deployment.lib" />
<transaction src="${sql.source}" />
</sql>
</target>
对于这个 Ant generic target run.sqlscript
我们看到它有下列参数:driver.name
, jdbc.url
, user.name
,user.password 及 sql.source
,driver.name
指 JDBC 数据库驱动类的名字,例如对于 Oracle 数据库来说它叫 oracle.jdbc.driver.OracleDriver
,jdbc.url
是要连接的数据库的 URL,例如 jdbc:oracle:thin:@9.186.12.11:1521:XE,user.name
和 user.password
分别是用户登陆名和密码,sql.source
是要调用的 SQL 脚本,<classpath refid="deployment.lib" />
定义的类路径中包含对应数据库的 JDBC 驱动类包 , 请您参考清单 5。
那么如果要从一个 target 中调用这个 generic target, 那么我们可以按照清单 2 给出的例子来做:
清单 2. 调用 run.sqlscript 的 call.database
<target name="call.database">
<antcall target="run.sqlscript">
<param name="driver.name" value=" oracle.jdbc.driver.OracleDriver"/>
<param name="jdbc.url" value=" jdbc:oracle:thin:@9.186.12.11:1521:XE"/>
<param name="user.name" value="test" />
<param name="user.password" value="test"/>
<param name="sql.source" value="${basedir}/../prj/oracle.sql" />
</antcall>
</target>
下面再看一个例子,例如我们要输出一条消息及这条消息输出时的时间,时间的格式可以按照用户的需求设定,那么我们可以按照清单 3 给出的例子写一个 generic target echo.time:
清单 3. 输出带有时间格式的消息的 echo.time
<target name="echo.time">
<tstamp>
<format property="time" pattern="${time.pattern}" locale="${locale}"/>
</tstamp>
<echo>${message} at ${time}</echo>
</target>
这个 generic target echo.time 有三个参数,time.pattern,locale 和 message
.time.pattern 指的是时间格式,如时间格式 yyyy/MM/dd hh:mm:ss:SS aa
,locale 即区域及语言设置,如 zh,CN,即中国中文,message 即是用户要输出的消息。
我们可以按照清单 4 中的例子调用这个 generic target echo.time。
清单 4. 调用 echo.time
<target name="call.echo.time">
<antcall target="echo.time">
<param name="time.pattern" value="yyyy/MM/dd hh:mm:ss:SS aa" />
<param name="locale" value="zh,CN" />
<param name="message" value="Begin deploy" />
</antcall>
<target>
组织 Ant generic targets
在使用 Ant generic targets 这个章节中演示两个例子后,我们来看如何组织这些 generic targets。 在面向对象的教程中经常会提到松耦合和内聚,松耦合即模块之间要减少依赖,内聚即实现类似功能的代码要放在一个模块中。按照这个原则我们可以把 generic target run.sqlscript
放在一个叫 Database.xml 的 XML 文件中,把 generic target echo.time
放在一个叫 Util.xml
的 XML
文件中 , 如清单 5 和 6 所示:
清单 5. Database.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <project name="database.generic">
<dirname property="proj.basedir" file="${ant.file.database.generic}"/> <path id="deployment.lib">
<fileset dir="${proj.basedir}/../Deployment/lib">
<include name="**.jar" />
</fileset>
</path> <target name="run.sqlscript">
<sql driver="${driver.name}" url="${jdbc.url}" userid="${user.name}"
password="${user.password}" expandProperties="true">
<classpath refid="deployment.lib" />
<transaction src="${sql.source}" />
</sql>
</target> </project>
清单 6. Util.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <project name="util.generic">
<dirname property="proj.basedir" file="${ant.file.util.generic}"/> <target name="echo.time">
<tstamp>
<format property="time" pattern="${time.pattern}" locale="${locale}"/>
</tstamp>
<echo>${message} at ${time}</echo>
</target> </project>
在这两个文件 Database.xml 和 Util.xml
中,您可能注意到都有以 dirname
开头用黑体标注的一行 , 这一行非常重要,它定义了一个 property proj.basedir
,property proj.basedir
是用来储存 Database.xml 和 Util.xm
l 两文件所处的路径,从而使它们不用依赖于调用者就能够确定自己的所处的路径,进而消除和调用者之间的耦合。
那么如何调用在这两个文件中的 generic targets 呢?我们来看一个例子,假设我们把 Database.xml 和 Util.xml
放在目录 Scripts
下 , 那么整个结构如图 1 所示:
图 1. generic targets 调用结构示例
在 Build.xml
中我们需要导入文件 Database.xml 和 Util.xml
,这样就可以在 Build.xml 里调用
generic targets run.sqlscript 和 echo.time 了
, 请参考清单 7。
清单 7. Build.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <project name="deployment">
<import file="${basedir}/Scripts/Database.xml" />
<import file="${basedir}/Scripts/Util.xml" />
</project>
总结
通过这样对 Ant 脚本的结构化设计,我们可以看出整个架构清晰,减少了耦合性,使得代码容易理解和维护,从而提高了重用性及开发效率。
http://www.cnblogs.com/iamhp/p/5756062.html
转: Ant 脚本的结构化设计的更多相关文章
- 利用ant脚本 自动构建svn增量/全量 系统程序升级包
首先请允许我这样说,作为开发或测试,你一定要具备这种 本领.你可以手动打包.部署你的工程,但这不是最好的方法.最好的方式就是全自动化的方式.开发人员提交了代码后,可以自动构建.打包.部署到测试环境. ...
- [自动运维]ant脚本打包,上传文件到指定服务器,并部署
1.根节点使用,表示根目录为当前目录,默认启动的target为build,项目名称为othersysm, <project basedir="." default=" ...
- 利用Ant脚本生成war包的详细步骤
使用ant脚本前的准备 1.下载一个ant安装包.如:apache-ant-1.8.4-bin.zip.解压到E盘. 2.配置环境变量.新增ANT_HOME:E:\apache-ant-1.8.4:P ...
- ant脚本编写
使用ant脚本前的准备 1.下载一个ant安装包.如:apache-ant-1.8.4-bin.zip.解压到E盘. 2.配置环境变量.新增ANT_HOME:E:\apache-ant-1.8.4:P ...
- Ant 脚本打印系统属性变量、ant内置属性
Ant 脚本打印系统属性变量.ant内置属性 作用 编写ant脚本的时候,经常会引用到系统属性,本脚本用于打印系统常用属性(System.getProperties)与环境变量(Environment ...
- 关于项目既要使用ant脚本又要使用maven pom.xml文件的问题
背景:项目使用的是ant脚本打包,但又需要maven去执行sonar代码扫描.所以项目中既有build.xml又有pom.xml build.xml设置的打包后产物文件夹为target,maven运行 ...
- 通过ant脚本编译打包android工程
通过ant脚本,编译打包android工程 1.Android程序编译.打包.签名.发布的三种方式: 方式一:命令行手动编译打包 方式二:使用ant自动编译打包 方式三:使用eclipse+AD ...
- ant脚本
jenkins在调用ant脚本时会遇到ant中的目标没有成功,但是最后的build状态却是success,如下图所示:代码中缺少一个},编译发生错误,最后的build成功. 解决方案:在关键的targ ...
- 运行ant脚本(转载)
http://blog.csdn.net/linwei_1029/article/details/5809801 运行ANT脚本的步骤 1.右击我的电脑-->属性-->高级-->环境 ...
随机推荐
- [妙味JS基础]第一课:属性操作、图片切换、短信发送模拟
知识点总结 HTML的属性操作:读.写 元素.属性名 => “读” 元素.属性名=新的值 => “写” 例如: oBtn.value => “读” oBtn.value='按钮' = ...
- Qml 定义 constant
对于程序中一些常量如字符串, 实数等, C++中经常用的方法, 是定义全局常量: 或者把所有意义相近的常量用一个单例类收集起来. QML是类JSON的标识性语言, 使用js 语法去操作对象. 在QML ...
- a标签href跳转---传值---禁止单引号
禁止加单引号1 href传参的值 (&t_type='航班') 错误 <a href="check_apply?applyid=<?=$applyid?>&am ...
- agentX各个角色功能
AgentX Roles 1.master An entity acting in a master agent role performs the following functions: - ...
- 转载–移动互联网终端的touch事件,touchstart, touchend, touchmove
转载请注明: 转载自WEB前端开发(www.css119.com)-关注常见的WEB前端开发问题.最新的WEB前端开发技术(webApp开发.移动网站开发).最好的WEB前端开发工具和最全的WEB前端 ...
- digitalocean纽约机房最先开通IPv6
DigitalOcean是一家位于美国的云主机服务商,总部位于纽约,成立于2012年.DigitalOcean的服务器全部采用KVM架构,具体高性能处理能力,并且配备SSD固态硬盘,速度优异.每台设备 ...
- chapter 13_1 算术类的元方法
假设用table来表示集合,用function去计算集合的交集.并集. 为了保持名称空间的整齐,将这些函数存入一个名为Set的table中. 现在,假设用“+”来计算两个集合的并集,那么就要让所有用于 ...
- matlab显示图像的横纵坐标
imshow(I);title('公路');axis on; %如果不需要,on改为off
- 1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上。
package zuoye; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- DLNA
DLNA最早由索尼.英特尔.微软等提出,全称是DIGITAL LIVING NETWORK ALLIANCE,旨在解决个人PC,消费电器,移动设备在内的无线网络和有线网络的互联互通,其实就是解决电脑和 ...