Ant 实战篇 (一)

                                                                             修订者: 黄 凯         

E_mail: hk_sz@163.com

前 言

由于现在公司进行Unit Test Case的整理阶段,所以抽空对Ant和Junit技术进行了一下了解,以下是集合了众家所长之精华(考虑到是按我的思路总结的,也许不能完全表述原作者的思路,所以在参考中我把所有参考过的文章网址或书籍都罗列了出来,大家有时间不妨去看看原文)。

如果对Ant部分参数不明白的话,请参看《Ant理论篇》系列或ant自带的文档。

 

目 录

一、 Ant 使用实例 

    
1.1  通过 Ant 的 copt task 将当前目录下最近更新的文件(按系统时间来区分)文件提交至指定目录
    
1.2 
 用 Ant 开发 java 程序 
    
 1.3 
 ant 结合 junit 进行软件自动测试 
    
 1.4 
 ant 开发和部署 web 应用程序 
    
 1.5 
 ant 打包( jar ) 应用程序 
    
1.6 
 ant 开发 EJB 应用程序 
参考

 

一、 Ant 使用实例

1.1 通过  Ant 的 copt task 将当前目录下最近更新的文件(按系统时间来区分)文件提交至指定目录 
 1 
 前提:在D盘下创建两个文件夹test1和test2,并在test1中创建build.xml文件,内容如下:

  <?  xml version  =  "  1.0  "  ?>   
<  project name  = "  test  "   default   = "  upload  " >  

   
<!--  设置提交的根路径以及提交目录属性  -->   
   
<  property name  = "  dest_drive  "  value  = "  D:\  "   />   
   
<  property name  = "  dest_dir  "  value  = "  ${dest_drive}\test2\test  "   />

   
<!--  如果没有提交目录的话,创建提交目录  -->   
   
<  target name  = "  create_dir  " >   
       
<  mkdir dir  = "  ${dest_dir}  "   />   
   
</  target  >  

   
<!--  通过copy task提交当前目录下除build.xml外所有非临时文件  -->   
   
<  target name  = "  upload  "  depends  = "  create_dir  " >   
       
<  copy todir  = "  ${dest_dir}  " >   
          
<  fileset dir  = "  .  " >   
             
<  exclude name  = "  **\build.xml  " />   
          
</  fileset  >   
       
</  copy  >   
   
</  target  >   
</  project  >  



2>进入DOS命令行状态,运行D:\test1>ant。进入test2中进行检查,看是否已经建立好了test子目录并且将test1中的文件除build.xml外都已经提交过来。如果这时你再运行ant,会发现其没有任何操作提示,因为已经没有新文件需要提交了。

注:有兴趣的朋友不妨将其中一个文件更新一下再执行一次,你会发现 upload: 下会出现新的信息。

 


1.2 用Ant开发java程序,以HelloWord为例

1. 本次实例的目录结构:
 D:\test 主目录
    
--
\src  源程序目录
    
--
\classes 编译后的class文件目录 

   首先在D盘创建test目录和src子目录。
2. 在src子目录下创建HelloWord.java文件,内容如下:
  public     class   HelloWord
  {
    
 public   static   void  main(String args[])
    
 {
        System.out.println(
 " Hello World! " );
    }
 

}
 

3.在test主目录下创建build.xml文件,内容如下: 

 

  <?  xml version  =  "  1.0  "  ?> 
 
<  project   default  =  "  build  "   basedir  =  "  .  "  >   

   
  <  property name  =  "  appname  "   value  =  "  HelloWord  "     /> 
   
  <  property name  =  "  base  "   value  =  "  D:\test  "     /> 
   
  <  property name  =  "  src  "   value  =  "  src  "     /> 
   
  <  property name  =  "  build  "   value  =  "  classes  "     /> 
   
  <  property name  =  "  myclasspath  "   value  =  "  ${base}\${build}  "     />   

   
  <  target name  =  "  build  "  > 
       
  <  mkdir dir  =  "  ${build}  "     /> 
       
  <  javac srcdir  =  "  ${src}  "   destdir  =  "  ${build}  "  > 
           
  <  include name  =  "  **/*.java  "     /> 
       
  </  javac  > 
   
  </  target  >   

   
  <  target name  =  "  run  "   depends  =  "  build  "  > 
       
  <  exec executable  =  "  java  "  > 
           
  <  arg line  =  "   -classpath ${myclasspath} ${appname}  "     /> 
       
  </  exec  > 
   
  </  target  >   

   
  <  target name  =  "  clean  "  > 
       
  <  delete includeEmptyDirs  =  "  true  "  > 
           
  <  fileset dir  =  "  ${build}  "     /> 
       
  </  delete  > 
   
  </  target  >   

  </  project  > 
 

为了提高程序的可移植性,我们将property分离出来组成build.properties文件。新的build.xml文件和build.properties文件内容如下:



build.properties文件:

  appname  =  HelloWord
src
  =  src
build
  =  classes
myclasspath
  =  $  {basedir}  \\$  {build}   

build.xml文件(property部分通过file调用build.properties即可):

  <?  xml version  =  "  1.0  "  ?> 
 
<  project   default  =  "  build  "   basedir  =  "  .  "  > 
 
   
  <  property file  =  "  build.properties  "     />   

   
  <  target name  =  "  build  "  > 
       
  <  mkdir dir  =  "  ${build}  "     /> 
       
  <  javac srcdir  =  "  ${src}  "   destdir  =  "  ${build}  "  > 
           
  <  include name  =  "  **/*.java  "     /> 
       
  </  javac  > 
   
  </  target  >   

   
  <  target name  =  "  run  "   depends  =  "  build  "  > 
       
  <  exec executable  =  "  java  "  > 
           
  <  arg line  =  "   -classpath ${myclasspath} ${appname}  "     /> 
       
  </  exec  > 
   
  </  target  >   

   
  <  target name  =  "  clean  "  > 
       
  <  delete includeEmptyDirs  =  "  true  "  > 
           
  <  fileset dir  =  "  ${build}  "     /> 
       
  </  delete  > 
   
  </  target  >   

  </  project  >   

4. 在test目录下运行ant查看执行结果。
再运行ant run和ant clean看看会怎么样,:)

 

1.3 ant 结合 junit 进行软件自动测试

1> 用ant结合junit启动基本编译和测试的自动过程如下:

★ 执行 JUnit 测试

★ 捕获测试结果,将结果记录到 XML 文件或其它格式的文件

★ 将结果转化为基于 XSL 格式的测试报告

★ 将这个报告转化为 HTML 格式

★ 用电子邮件发送报告

     一旦捕获结果,就可以使用XML格式化器将每个测试套件运行的故障和错误数,连同软件包和类名还有测试套件的执行时间一起引入。对于每个测试套件,都有以下信息被捕获:

☆ 测试案例的名称

☆ 执行的持续时间

☆ 故障或错误的类型(如果适用)

☆ 任何故障或错误的详细信息

2> 本次实例的目录结构:

D:\car   主目录

     \src     源程序目录

     \classes编译后的class文件目录

     \etc     其他

         \xsl     XSL文件目录

首先在D盘创建car目录、src子目录和etc子目录,并从%ANT_HOME%\etc下拷贝junit-noframes.xsl文件至D:\car\etc\xsl子目录下。

3> 从 http://download.sourceforge.net/junit/junit3.8.zip 下载,解压至D盘,将其目录下的junit.jar文件拷贝至%ANT_HOME%\lib目录下。

4> 在src子目录下新建Car.java以及testCar.java文件。

Car.java的内容如下:

//将要被测试的类

public class Car

{

    public int getWheels()

    {

        return 3;

    }

}

testCar.java的内容如下:

//执行测试的类

import junit.framework.*;

 

public class testCar extends TestCase

{

    protected int expectedWheels;

    protected Car myCar;

   

    public testCar(String name)

    {

        super(name);

    }

   

    protected void setUp()

    {

        expectedWheels = 4;

        myCar = new Car();

    }

   

    public static Test suite()

    {

        return new TestSuite(testCar.class);

    }

   

    public void testGetWheels()

    {

        assertEquals(expectedWheels, myCar.getWheels());

    }

}

5> 在build.xml和build.properties文件。

buil.properties文件内容如下:

src.dir=src

build.dir=classes

xsl.dir=etc/xsl

report.dir=report

build.xml文件内容如下:

<?xml version="1.0"?>
<project default="build" basedir=".">
 
    <property file="build.properties" description="Transfer property from .properties file"/>

    <target name="build" description="Build the work directory">
        <mkdir dir="${build.dir}" />
        <mkdir dir="${report.dir}" />
        <javac srcdir="${src.dir}" destdir="${build.dir}">
            <include name="**/*.java" />
        </javac>
    </target>
   
   <target name="junit" depends="build"  description="Execute Unit Tests">
        <tstamp/>
  <junit printsummary="yes">
   <classpath>
       <pathelement location="${build.dir}"/>
     </classpath>

        <formatter type="xml" />
      <batchtest todir="${report.dir}">
         <fileset dir="${src.dir}">
            <include name="**/testCar.java" />
       </fileset>
        </batchtest>
     </junit>

     <junitreport todir="${report.dir}">
        <fileset dir="${report.dir}">
          <include name="TEST-*.xml"/>
        </fileset>
        <report format="noframes" styledir="${xsl.dir}" todir="${report.dir}"/>
     </junitreport>
    </target>

 <target name="clean" description="Delete the work directory">
     <delete includeEmptyDirs="true">
            <fileset dir="${build.dir}"/>
            <fileset dir="${report.dir}"/>
       </delete>
   </target>

</project>

6> 在D:\car目录下运行ant junit,

这样在car\report中生成了 junit-noframes.html 、TESTS-TestSuites.xml和TEST-testCar.xml文件,打开junit-noframes.html查看结果。运行ant clean恢复原状。


 

1.4 ant 开发和部署 web 应用程序

1> 前提:

★ 完成《JBuilder9+Weblogic7实战篇之Filter运用篇》,因为这是我们这次打包的实例;

★ 将Filter整个目录拷贝至D盘,我是用Jbuilder编辑的,所以除classes文件夹和Filter.war文件删除外,其他的保留,我们要用到的相关目录结构如下:

D:\Filter

     src java源文件目录

     Filter   JSP文件及配置文件目录

         WEB-INF  配置文件目录

2> 由于不是在Jbuilder环境进行编译,所以需要在CLASSPATH中定义servlet的路径。首先,我们到

http://java.sun.com/products/servlet/download.html

下载

http://java.sun.com/webapps/download/Redirect/103537442/5847479377282807053505607246086069333228938
633594669477228720286350602472859339008063305596058473206-4908/servlet-2_3-fcs-classfiles.zip

然后将包含servlet-2_3-fcs-classfiles.zip的整个路径加到CLASSPATH中。

3> 在D:\Filter目录下创建build.properties和Filter.xml文件。

build.properties文件内容如下:

WebLogic.user_projects.mydomain.applications=C:/bea/user_projects/mydomain/applications

filter=Filter

dest=classes.ant

src=src

Filter.xml文件内容如下:

<?xml version="1.0"?>
<project default="init" basedir=".">
 
    <property file="build.properties"/>

    <target name="init" description="initialization">
        <mkdir dir="${dest}" />
        <javac destdir="${dest}">
            <src path="${src}"/>
        </javac>
    </target>

 <target name="war" depends="init">
     <war destfile="Filter.war" webxml="${filter}/WEB-INF/web.xml" compress="false">
        <classes dir="${dest}">
          <include name="**/*.*"/>
        </classes>
        <fileset dir="${filter}">
          <include name="**/*.*"/>
        </fileset>
       </war>
    </target>
    
    <target name="deploy" depends="war">
     <copy todir="${WebLogic.user_projects.mydomain.applications}">
      <fileset dir="." includes="Filter.war"/>
     </copy>
    </target> 
    
    <target name="rebuild" depends="clean,war">
     <copy todir="${WebLogic.user_projects.mydomain.applications}">
      <fileset dir="." includes="Filter.war"/>
     </copy>
    </target>    
    

 <target name="clean">
     <delete includeEmptyDirs="true">
            <fileset dir="${dest}"/>
            <fileset dir=".">
             <include name="Filter.war"/>
            </fileset>
            <fileset dir="${WebLogic.user_projects.mydomain.applications}">
                <include name="Filter.war"/>
            </fileset>
       </delete>
   </target>

</project>

4> 启动Weblogic server,在D:\Filter目录下运行ant deploy -buildfile Filter.xml进行部署,打开IE,
在地址栏输入http://localhost:7001/Filter/login.jsp查看是否能正常运行。然后,你可以修改Filter子目录下的login.jsp文件中的代码,
运行ant rebuild -buildfile Filter.xml重新部署,然后刷新http://localhost:7001/Filter/login.jsp查看显示修改后的结果是否正确。

5> 以上第3步是将web应用程序通过拷贝到%BEA_HOME%\user_projects\mydomain\applications目录下进行部署的,
其实ant提供了对应于Weblogic的发布任务<serverdeploy>。请用下面代码替换掉build.properties和Filter.xml文件中的代码。

build.properties文件内容如下:

WebLogic.user_projects.mydomain.applications=C:/bea/user_projects/mydomain/applications

filter=Filter

dest=classes.ant

src=src

weblogic.server=C:/bea/weblogic700/server

username=training

user.password=training

weblogic.filter=C:/bea/user_projects/mydomain/myserver/upload/Filter

Filter.xml文件内容如下:

<?xml version="1.0"?>
<project default="init" basedir=".">
 
    <property file="build.properties"/>

    <target name="init" description="initialization">
        <mkdir dir="${dest}" />
        <javac destdir="${dest}">
            <src path="${src}"/>
        </javac>
    </target>

 <target name="war" depends="init">
     <war destfile="Filter.war" webxml="${filter}/WEB-INF/web.xml" compress="false">
        <classes dir="${dest}">
          <include name="**/*.*"/>
        </classes>
        <fileset dir="${filter}">
          <include name="**/*.*"/>
        </fileset>
       </war>
    </target>
    
    <target name="deploy" depends="war">
     <serverdeploy action="deploy" source="Filter.war">
         <weblogic application="Filter"
          server="t3://127.0.0.1:7001"
          classpath="${weblogic.server}/lib/weblogic.jar"
          username="${username}" 
          password="${user.password}"  
          component="Filter:myserver"     
          debug="true"/>
        </serverdeploy>
    </target> 
    
    <target name="redeploy" depends="war">
     <serverdeploy action="update" source="Filter.war">
         <weblogic application="Filter"
          server="t3://127.0.0.1:7001"
          classpath="${weblogic.server}/lib/weblogic.jar"
          username="${username}" 
          password="${user.password}"  
          component="Filter:myserver"     
          debug="true"/>
        </serverdeploy>
    </target> 
    
    <target name="list">
     <serverdeploy action="list">
         <weblogic application="Filter"
          server="t3://127.0.0.1:7001"
          classpath="${weblogic.server}/lib/weblogic.jar"
          username="${username}" 
          password="${user.password}"    
          debug="true"/>
        </serverdeploy>
    </target> 
    
    <target name="undeploy">
     <serverdeploy action="undeploy">
         <weblogic application="Filter"
          server="t3://127.0.0.1:7001"
          classpath="${weblogic.server}/lib/weblogic.jar"
          username="${username}" 
          password="${user.password}"    
          debug="true"/>
        </serverdeploy>
    </target> 
    
    <target name="delete">
        <serverdeploy action="delete" source="Filter.war">
         <weblogic application="Filter"
          server="t3://127.0.0.1:7001"
          classpath="${weblogic.server}/lib/weblogic.jar"
          username="${username}"
          password="${user.password}"/>
        </serverdeploy>
    </target>    

 <target name="clean">
     <delete includeEmptyDirs="true">
            <fileset dir="${dest}"/>
            <fileset dir="${weblogic.filter}"/>
            <fileset dir=".">
             <include name="Filter.war"/>
            </fileset>
            <fileset dir="${WebLogic.user_projects.mydomain.applications}">
                <include name="Filter.war"/>
            </fileset>
       </delete>
   </target>

</project>
6> 启动Weblogic server,在D:\Filter目录下运行ant deploy -buildfile Filter.xml进行部署, 打开 IE,在地址栏输入 http://localhost:7001/console/后在左边的单击 

mydomain\deployments\Web Applications\Filter
 ,然后在右边单击“ deploy ”选项栏,查看是否部署成功。 
 开一个IE,在地址栏输入http://localhost:7001/Filter/login.jsp
看是否能正常运行。接下来运行ant undeploy -buildfile Filter.xml进行取消部署, 刷新 http://localhost:7001/console/ 的 浏览器,查看部署是否成功取消。

   然后,你可以修改Filter子目录下的login.jsp文件中的代码, 再运行 ant redeploy -buildfile Filter.xml 进行重新部署, 再刷新 http://localhost:7001/console/ 的 浏览器,查看
部署是否成功。

   然后刷新http://localhost:7001/Filter/login.jsp查看显示修改后的结果是否正确。

   最后,从Web Applications中删除Filter,运行ant delete -buildfile Filter.xml进行删除。 刷新 http://localhost:7001/console/ 的浏览器,查看是否成功(在左边的单击
mydomain\deployments\Web Applications )。