zoukankan      html  css  js  c++  java
  • 转: 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.nameuser.password 及 sql.sourcedriver.name 指 JDBC 数据库驱动类的名字,例如对于 Oracle 数据库来说它叫 oracle.jdbc.driver.OracleDriverjdbc.url 是要连接的数据库的 URL,例如 jdbc:oracle:thin:@9.186.12.11:1521:XE,user.nameuser.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 aalocale 即区域及语言设置,如 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.xmlXML 文件中 , 如清单 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 调用结构示例

    图 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

  • 相关阅读:
    python,selenium遇到的问题
    python环境配置
    性能测试函数
    性能测试的关注点
    环境配置
    性能监控工具使用
    linux路径
    linux权限
    自动化测试工具
    书籍
  • 原文地址:https://www.cnblogs.com/feiyun8616/p/6089067.html
Copyright © 2011-2022 走看看