`
守望者
  • 浏览: 54321 次
  • 来自: ...
社区版块
存档分类
最新评论

[转载] 无所不能的“蚂蚁”--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. <!--sp-->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. <!--sp-->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. <!--sp-->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. <!--sp-->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,多数任务的默认值为failonerror="true",既当此任务构建失败时,失败信息会传递给控制台,并导致build failed,failonerror只支持在新的JVM里运行.
  1. <target name="run" depends="jar">  
  2.  <java fork="true" maxmemory="64m" jar="test.jar"  
  3.   failonerror="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. <!--sp-->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. <!--sp-->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. <!--sp-->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 usefile="false" type="brief"> </formatter>
Junit支持多个formatter同时存在:
<formatter usefile="false" type="brief"> </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=
分享到:
评论

相关推荐

    MatlabGUI使用java组件无所不能-uicomponent.m

    MatlabGUI使用java组件无所不能-uicomponent.m 是不是曾经想做出漂亮的GUI 界面? 是不是曾经想在 Matlab GUI里面显示网页? 看看这个界面: matlab_java.png 所以,...

    你的习惯对了 你无所不能-习惯的力量PPT模板.pptx

    标题中的“你的习惯对了,你无所不能-习惯的力量PPT模板”暗示了这个PPT内容将探讨习惯如何塑造个人能力和成功。描述中提到“每天有40%的行为并不是真正由决定促成的,而是出于习惯”,这引用了一个研究发现,强调了...

    苹果JBL无所不能遥控器操作说明

    ### 苹果JBL无所不能遥控器操作说明详解 #### 一、产品介绍与安全须知 ##### 产品概述 苹果JBL“无所不能”遥控器是一款专为苹果设备设计的多功能遥控器,具备六个主要按钮,能够实现对音频播放器、电视等多种设备...

    互联网 智慧能源-无所不能 完整

    智慧能源-无所不能 完整

    万能编程器软件---无所不能

    总的来说,"万能编程器软件---无所不能"不仅是一个工具,更是一种解决方案,它简化了对各种类型芯片编程的过程,提高了开发效率。无论是用于学习、原型设计还是大规模生产,这样的软件都是电子工程师的得力助手。其...

    让迅雷无所不能下载.rar

    "让迅雷无所不能下载"这个标题暗示了一个可能的增强迅雷下载功能的补丁或者插件,使得用户能够下载更多类型或者原本限制下载的资源。 首先,迅雷的核心技术是P2SP(peer-to-server-peer),它结合了传统的P2P和P2S...

    让迅雷无所不能下载、通吃一切

    让迅雷无所不能下载、通吃一切 让迅雷无所不能下载、通吃一切

    能源互联网白皮书-to 无所不能.pptx

    能源互联网白皮书-to 无所不能.pptx

    电脑测试软件很好用无所不能

    标题中的“电脑测试软件很好用无所不能”表明我们讨论的是一款功能强大的计算机系统诊断和测试工具,它能够全面地分析和评估电脑硬件和软件的性能。这类软件通常包含多个模块,用于测试处理器、内存、硬盘、显卡等...

    让迅雷无所不能的工具 迅雷下载其他资源 电驴 快车

    本文将详细介绍如何利用特定的工具或方法,使迅雷能够处理这些非传统迅雷链接的资源,实现“让迅雷无所不能”的目标。 首先,了解电驴(eMule)和快车(FlashGet)的下载机制。电驴是一种P2P(peer-to-peer)共享网络,...

    真正的无所不能!

    标题中的“真正的无所不能!”可能是指这个压缩包包含了大量的IT学习资源,涵盖了多个领域的知识,而描述中的“我所下的所有书的整合!绝对经典!只要你能想到的这里面都有!”进一步证实了这一点,说明这个集合包含...

    VB无所不能系列(包含文档说明和代码示例)

    根据提供的文件信息,以下是关于VB无所不能系列的详细知识点。 ### 1. 指针 指针在VB中的使用与C语言等其他编程语言中的使用有所不同,因为VB是一种高级语言,它对内存访问进行了封装。在VB中,可以通过API调用和...

    重磅!谷歌发布5620亿参数多模态模型PaLM-E,机器人操控无所不能

    谷歌发布5620亿参数多模态模型PaLM-E,机器人操控无所不能" 这个标题揭示了谷歌在人工智能领域的一项重大突破,即他们推出了一个具有5620亿参数的多模态模型,命名为PaLM-E。这里的“重磅”暗示了该发布的重要性,...

    能源互联网白皮书-to 无所不能.zip

    "能源互联网白皮书-to 无所不能.zip" 文件包含了对这一主题的深入探讨,尤其通过其包含的 "能源互联网白皮书-to 无所不能.pptx" 讲义,我们可以从多个方面了解能源互联网的核心理念和应用实践。 1. **定义与概念**...

    VB无所不能,叫你加深了解

    网络精选教程,希望大家不要忘记VB,包括GDI绘画等详解的例子

    互联网 智慧能源-无所不能 .pptx

    【智慧能源】是一种结合了互联网技术的新型能源管理体系,旨在通过智能化的方式优化能源生产、分配和消费,提高能源效率,减少环境污染,同时满足人们日益增长的多元化能源需求。这一概念的提出,源于对传统能源系统...

    超级模块4.2无所不能

    无所不能 相当强大 目前最强大内容最丰富的超级模块

    互联网 智慧能源-无所不能 完整pptx.pptx

    【智慧能源】是一种结合了互联网技术的新型能源管理系统,它超越了传统的能耗监测,实现了监测、考核、管理、控制的全面整合,形成了一个四位一体的精细化能源管理平台。该平台可以细化到对每个用户或者房间的能耗...

    快乐网管之无所不能软件

    【快乐网管之无所不能软件】是一款针对初级用户的自动化工具,类似于知名的【按键精灵】,旨在简化用户在日常计算机操作中的复杂流程。该软件通过模拟鼠标点击和键盘输入,能够执行一系列预先设定好的任务,极大地...

Global site tag (gtag.js) - Google Analytics