Ant“蚂蚁"的一些使用小结

说他无所不能,好像有点夸张,但是用过Ant之后,感觉真的是只有想不到没有作不到.Ant,原作者选择他作为软件名字的意思是指"令一个简洁的工具"(Another Neat Tool),而这个真正的名字现在去很少为人所知,但这丝毫不影响他成为最优秀的构建工具.

     现在开始我将进入一个"蚂蚁"的世界,通过例子,真真正正去了解他!

     文章参考资料可以到http://www.manning.com/antbook 去下载

     Ant的最好学习资料<<使用Ant进行Java开发>>

      Ant的官方网站: http://ant.apache.org/

      Ant的最新版本:Ant 1.6.5

      本文所有的例子运行的环境:JDK1.4.2,Ant1.6.2,eclipse3.0

一.使用Ant运行Java程序

我们先从简单的Hello学起,目录结构如下

project--

      |src--

      |         |--org.ant.chapter1.Hello

      |bin     

      |build.xml

以后的例子大多采用此目录结构,特例会额外声明
build.xml文件

   1. <xml version="1.0"?> 
   2. <project name="project" default="run"> 
   3.  <target name="compile"> 
   4.   <javac destdir="bin" srcdir="src">javac> 
   5.  </target> 
   6.    
   7.  <target name="run" depends="compile"> 
   8.   <java classname="org.ant.chapter1.Hello"> 
   9.   </java> 
  10. </target> 
  11. </project>   


从结构来看构建文件很简单,里面的内容大家也一定能够看得懂,可以看出Ant的核心任务就是target,一个Ant文件有多个target组成,而这些target之间,又有相互的依赖关系--depends,运行的时候默认运行project中指定的target.
javac--编译java文件     java--运行java文件
使用eclipse中集成的Ant运行build.xml文件(当然,也可以将ANT_HOME加到Path中,在命令行中运行)

   1. Buildfile: D:/MyEclipse/workspace/sad/build.xml  
   2. compile:  
   3. run:  
   4.      [java] Working directory ignored when same JVM is used.  
   5.      [java] Could not find org.ant.chapter1.Hello. Make sure you have it in your classpath  
   6.      [java]  at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:166)  
   7.      [java]  at org.apache.tools.ant.taskdefs.Java.run(Java.java:705)  
   8.      [java]  at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:177)  
   9.      [java]  at org.apache.tools.ant.taskdefs.Java.execute(Java.java:83)  
  10.      [java]  at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)  
  11.      [java]  at org.apache.tools.ant.Task.perform(Task.java:364)  
  12.      [java]  at org.apache.tools.ant.Target.execute(Target.java:341)  
  13.      [java]  at org.apache.tools.ant.Target.performTasks(Target.java:369)  
  14.      [java]  at org.apache.tools.ant.Project.executeTarget(Project.java:1214)  
  15.      [java]  at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:379)  
  16.      [java]  at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:135)  
  17. BUILD SUCCESSFUL  
  18. Total time: 703 milliseconds
           


,java入门的经典错误,ClassNotDefException,可见是classpath设置问题,而观察得到compile成功运行,所以我们在run-target里面加入classpath的配置

   1. <xml version="1.0"?> 
   2. <project name="project" default="run"> 
   3.  <target name="compile"> 
   4.   <javac destdir="bin" srcdir="src"></javac> 
   5.  </target> 
   6.    
   7.  <target name="run" depends="compile"> 
   8.   <java classname="org.ant.chapter1.Hello"> 
   9.    <classpath path="bin"></classpath> 
  10.   </java> 
  11.  </target> 
  12. </project> 

运行

   1. Buildfile: D:/MyEclipse/workspace/sad/build.xml  
   2. compile:  
   3. run:  
   4.      [java] Hello World!  
   5. BUILD SUCCESSFUL  
   6. Total time: 672 milliseconds
 


成功!!第一个Ant应用完成,有人会说:用IDE运行岂不是更简单,但是你要知道运行java程序只是Ant的一个小小的功能,后面我们会看到Ant的更强大的功能!

 

下一篇文章将介绍java程序运行的扩展及用Ant运行tomcat!
java程序运行的扩展

1.带有参数的应用程序运行

Ant在<java></java>任务中提供了<arg></arg>元素,<arg></arg>有四种属性value,file,line,path

   1. public class Hello {  
   2.     public static void main(String[] args) {  
   3.         System.out.println("Hello " + args[0]);        
   4.         File file = new File(args[1]);  
   5.         String[] filename = file.list();  
   6.           
   7.         for(int i = 0; i < filename.length; i++) {  
   8.             System.out.println(filename[i]);  
   9.         }  
  10.     }  
  11. } 

build.xml

   1. xml version="1.0"?> 
   2. <project name="project" default="run"> 
   3.  <property name="run.classpath" value="bin"></property> 
   4.    
   5.  <target name="compile"> 
   6.   <javac destdir="bin" srcdir="src"></javac> 
   7.  </target> 
   8.    
   9.  <target name="run" depends="compile"> 
  10.   <java classname="org.ant.chapter1.Hello"> 
  11.    <classpath path="${run.classpath}"></classpath> 
  12.    <arg value="Ant"/> 
  13.    <arg file="D:/rag"/> 
  14.   </java> 
  15.  </target> 
  16. </project> 


   1. Buildfile: D:/MyEclipse/workspace/sad/build.xml  
   2. compile:  
   3. run:  
   4.      [java] Hello Ant  
   5.      [java] hello.dat  
   6. BUILD SUCCESSFUL  
   7. Total time: 734 milliseconds
 

 

2.控制新的JVM

一般的<java></java>任务都运行在当前的JVM中,单一些特定的情况下将Ant运行在新的JVM下面,这时只需要将<java></java>中的一个属性fork设置为true就可以了.
我们知道,java命令提供了许多的运行参数,用于指定JVM的属性,同样在Ant也提供相应的属性,看例子:

   1. <?xml version="1.0"?> 
   2. <project name="project" default="run"> 
   3.  <property name="run.classpath" value="bin"></property> 
   4.  <property name="Search.JVM.extra.args" value="-Xincgc"></property> 
   5.    
   6.  <target name="compile"> 
   7.   <javac destdir="bin" srcdir="src"></javac> 
   8.  </target> 
   9.    
  10.  <target name="run" depends="compile"> 
  11.   <java classname="org.ant.chapter1.Hello" fork="true"   
  12.    maxmemory="64m"> 
  13.    <classpath path="${run.classpath}"></classpath>   
  14.    <jvmarg line="${Search.JVM.extra.args}"/> 
  15.    <arg value="Ant"/> 
  16.    <arg file="D:/rag"/> 
  17.   </java> 
  18.  </target> 
  19. </project> 

 

3.运行jar文件,使用failonerror处理错误

<java></java>同样提供了运行jar文件的属性

MANIFEST.MF

 

   1. Mainfest-Version: 1.0 
   2. Created-By: myth  
   3. Sealed: false 
   4. Main-Class: org.ant.chapter1.Hello 

build.xml

   1. xml version="1.0"?> 
   2. <project name="project" default="run"> 
   3.  <property name="run.classpath" value="bin"></property> 
   4.  <property name="Search.JVM.extra.args" value="-Xincgc"></property> 
   5.    
   6.  <target name="compile"> 
   7.   <javac destdir="bin" srcdir="src"></javac> 
   8.  </target> 
   9.    
  10.  <target name="jar" depends="compile"> 
  11.   <jar destfile="test.jar" update="true"   
  12.    manifest="MANIFEST.MF"> 
  13.    <fileset dir="bin"> 
  14.     <include name="**/*.class"/> 
  15.    </fileset> 
  16.   </jar> 
  17.  </target> 
  18.    
  19.  <target name="run" depends="jar"> 
  20.   <java fork="true" maxmemory="64m" jar="test.jar"> 
  21.    <classpath path="${run.classpath}"></classpath>   
  22.    <jvmarg line="${Search.JVM.extra.args}"/> 
  23.    <arg value="Ant"/> 
  24.    <arg file="D:/rag"/> 
  25.   </java> 
  26.  </target> 
  27. </project> 


在某些情况下,我们不希望由于一些不重要的任务构建失败,而导致整个构建的失败,所以Ant提供了一个共同的属性-failonerror, 多数任务的默认值为failοnerrοr="true",既当此任务构建失败时,失败信息会传递给控制台,并导致build failed,failonerror只支持在新的JVM里运行.

   1. <target name="run" depends="jar"> 
   2.  <java fork="true" maxmemory="64m" jar="test.jar" 
   3.   failοnerrοr="false" > 
   4.   <classpath path="${run.classpath}"></classpath>   
   5.   <jvmarg line="${Search.JVM.extra.args}"/> 
   6.   <arg value="Ant"/> 
   7.   <arg file="D:/rag"/> 
   8.  </java> 
   9. </target> 

可以看出虽然run构建失败,但是Ant还是执行了,原来的jar文件,并且BUILD SUCCESSFUL!!


使用Ant运行tomcat
Ant使用<exec></exec>任务运行本地程序,先看一个例子:

   1. <xml version="1.0"?> 
   2. <project name="project" default="run"> 
   3.  <target name="run"> 
   4.   <exec executable="cmd"> 
   5.    <arg value="/C a.bat"/> 
   6.   </exec> 
   7.  </target> 
   8. </project> 


a.bat

   1. @echo off  
   2. echo Hello >> a.txt 

运行完后,会在根目录生成a.txt文件,里面内容为Hello
下面我们来运行tomcat

   1. <xml version="1.0"?> 
   2. <project name="project" default="tomcat-start"> 
   3.  <property name="tomcat.dir" value="c:/Tomcat5"></property> 
   4.    
   5.  <target name="tomcat-start"> 
   6.   <exec dir="${tomcat.dir}/bin" executable="cmd"> 
   7.    <env key="CATALINA_HOME" path="${tomcat.dir}"/> 
   8.    <arg value="/C startup.bat"/> 
   9.   </exec> 
  10.  </target> 
  11.  <target name="tomcat-stop"> 
  12.   <exec dir="${tomcat.dir}/bin" executable="cmd"> 
  13.    <env key="CATALINA_HOME" path="${tomcat.dir}"/> 
  14.    <arg value="/c shutdown.bat"/> 
  15.   </exec> 
  16.  </target> 
  17. </project> 


四.使用Ant进行Junit测试
   我们除了使用java来直接运行junit之外,我们还可以使用junit提供的junit task与ant结合来运行。涉及的几个主要的ant task如下:
l         <junit></junit>,定义一个junit task
l         <batchtest></batchtest>,位于<junit></junit>中,运行多个TestCase
l         <test></test>,位于<junit></junit>中,运行单个TestCase
l         <formatter> </formatter> ,位于<junit></junit>中,定义一个测试结果输出格式
l         <junitreport></junitreport>,定义一个junitreport task
l         <report></report>,位于<junitreport></junitreport>中,输出一个junit report

   运行Junit需要jakarta-ant-1.4-optional.jar和Junit.jar包,因为这两个包用于支持ant task--<junit></junit>的,所以不能在build.xml文件中加载,需要将他们放到ANT_HOME中去.使用eclipse可以按照一下步骤加入:
Windows-Preference-Ant-Runtime-Ant Home Entries
 下面看一个Junit测试的例子:

   1. <xml version="1.0"?> 
   2. <project name="project" default="junit" 
   3.          <property name="run.classpath" value="bin"></property> 
   4.          <property name="run.srcpath" value="src"></property> 
   5.          <property name="test.srcpath" value="test"></property> 
   6.          <property name="lib.dir" value="lib"/>       
   7.          <path id="compile.path"> 
   8.                    <pathelement location="${lib.dir}/junit-3.8.1.jar"/> 
   9.                    <pathelement location="${lib.dir}/log4j-1.2.8.jar"/> 
  10.          </path> 
  11.          <target name="compile">   
  12.                    <javac destdir="${run.classpath}" srcdir="${run.srcpath}" 
  13.                            classpathref="compile.path"/> 
  14.                    <javac destdir="${run.classpath}" srcdir="${test.srcpath}" 
  15.                             classpathref="compile.path"/> 
  16.          </target> 
  17.          <target name="junit" depends="compile"> 
  18.                    <junit printsummary="true"> 
  19.                             <classpath path="${run.classpath}"></classpath> 
  20.                             <test name="org.ant.test.Test1"></test> 
  21.                    </junit> 
  22.          </target> 
  23. </project> 

可以看出Junit的使用基本和java差不多, printsummary允许输出junit信息,当然Ant提供formatter属性支持多样化的junit信息输出.Ant包含三种形式的formatter:

brief:以文本格式提供测试失败的详细内容;

plain:以文本格式提供测试失败的详细内容以及每个测试的运行统计;

xml:以xml格式提供扩展的详细内容,包括正在测试时的Ant特性,系统输出,以及每个测试用      例的系统错误.

       使用formatter时建议将printsummary关闭,因为他可能对formatter的生成结果产生影响,并多生成一份同样的输出.当然我们可以使用formatter将输出结果显示在console中:

<formatter type="brief" usefile="false"> </formatter>
Junit支持多个formatter同时存在:
<formatter type="brief" usefile="false"> </formatter>
<formatter type="xml"> </formatter>
使用xml我们可以得到扩展性更强的信息输出,这时在<test></test>中要设定todir来指定xml的输出路径.
  在通常情况下我们不可能一个一个来处理junit,所以Ant提供了<batchtest></batchtest>,可以在他里面嵌套文件集(fileset)以包含全部的测试用例.
对于大量的用例,使用控制台输出,或者使用文件或xml文件来作为测试结果都是不合适的,Ant提供 了<junitreport></junitreport>任务使用XSLT将xml文件转换为HTML报告.该任务首先将生成 的XML文件整合成单一的XML文件,然后再对他进行转换,这个整合的文件默认情况下被命名为:TESTS-TestSuites.xml.

   1. <"${test.xml}">  
   2. <"${test.xml}">  
   3. <"TEST-*.xml"/>  
   4.                  
   5.  <"frames" todir="${test.report}"/>  
   6.          

<report></report>元素指示转换过程中生成有框架(frames)或者无框架的类似与 javadoc格式的文件,并保存到todir所在的目录下面.(由于xalan对于JDK1.4以上的版本存在问题,所以要生成HTML文件需要以下步 骤:现在最新的xalan,在%JAVA_HOME%/jre/lib中建立文件夹endorsed.将xalan中的jar文件copy到里面).
下面看一个完整的例子:
xml 代码

   1. <?xml version="1.0"?> 
   2. <project name="project" default="junit"> 
   3.     <property name="run.classpath" value="bin"></property> 
   4.     <property name="run.srcpath" value="src"></property> 
   5.     <property name="test.srcpath" value="test"></property> 
   6.     <property name="test.xml" value="xml"></property> 
   7.     <property name="test.report" value="report"></property> 
   8.     <property name="lib.dir" value="lib"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值