转: 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.xml 两文件所处的路径,从而使它们不用依赖于调用者就能够确定自己的所处的路径,进而消除和调用者之间的耦合。
那么如何调用在这两个文件中的 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

浙公网安备 33010602011771号