[转载] 无所不能的“蚂蚁”--Ant

转载 2006年06月03日 13:04:00
说他无所不能,好像有点夸张,但是用过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文件

<?xml version="1.0"?>
<project name="project" default="run">
 <target name="compile">
  <javac destdir="bin" srcdir="src"></javac>
 </target>
 
 <target name="run" depends="compile">
  <java classname="org.ant.chapter1.Hello">
  </java>
 </target>
</project>

       从结构来看构建文件很简单,里面的内容大家也一定能够看得懂,可以看出Ant的核心任务就是target,一个Ant文件有多个target组成,而这些target之间,又有相互的依赖关系--depends,运行的时候默认运行project中指定的target.

javac--编译java文件     java--运行java文件

使用eclipse中集成的Ant运行build.xml文件(当然,也可以将ANT_HOME加到Path中,在命令行中运行)

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

 

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

<?xml version="1.0"?>
<project name="project" default="run">
 <target name="compile">
  <javac destdir="bin" srcdir="src"></javac>
 </target>
 
 <target name="run" depends="compile">
  <java classname="org.ant.chapter1.Hello">
   <classpath path="bin"></classpath>
  </java>
 </target>
</project>
 

运行

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

 

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

 

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

java程序运行的扩展

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

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

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello " + args[0]);     
        File file = new File(args[1]);
        String[] filename = file.list();
       
        for(int i = 0; i < filename.length; i++) {
            System.out.println(filename);
        }
    }
}

 

build.xml

<?xml version="1.0"?>
<project name="project" default="run">
 <property name="run.classpath" value="bin"></property>
 
 <target name="compile">
  <javac destdir="bin" srcdir="src"></javac>
 </target>
 
 <target name="run" depends="compile">
  <java classname="org.ant.chapter1.Hello">
   <classpath path="${run.classpath}"></classpath>
   <arg value="Ant"/>
   <arg file="D:/rag"/>
  </java>
 </target>
</project>

Buildfile: D:/MyEclipse/workspace/sad/build.xml
compile:
run:
     [java] Hello Ant
     [java] hello.dat
BUILD SUCCESSFUL
Total time: 734 milliseconds

 

2.控制新的JVM

一般的<java>任务都运行在当前的JVM中,单一些特定的情况下将Ant运行在新的JVM下面,这时只需要将<java>中的一个属性fork设置为true就可以了.

我们知道,java命令提供了许多的运行参数,用于指定JVM的属性,同样在Ant也提供相应的属性,看例子:

<?xml version="1.0"?>
<project name="project" default="run">
 <property name="run.classpath" value="bin"></property>
 <property name="Search.JVM.extra.args" value="-Xincgc"></property>
 
 <target name="compile">
  <javac destdir="bin" srcdir="src"></javac>
 </target>
 
 <target name="run" depends="compile">
  <java classname="org.ant.chapter1.Hello" fork="true"
   maxmemory="64m">
   <classpath path="${run.classpath}"></classpath>
   <jvmarg line="${Search.JVM.extra.args}"/>
   <arg value="Ant"/>
   <arg file="D:/rag"/>
  </java>
 </target>
</project>

 

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

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

MANIFEST.MF

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

build.xml

<?xml version="1.0"?>
<project name="project" default="run">
 <property name="run.classpath" value="bin"></property>
 <property name="Search.JVM.extra.args" value="-Xincgc"></property>
 
 <target name="compile">
  <javac destdir="bin" srcdir="src"></javac>
 </target>
 
 <target name="jar" depends="compile">
  <jar destfile="test.jar" update="true"
   manifest="MANIFEST.MF">
   <fileset dir="bin">
    <include name="**/*.class"/>
   </fileset>
  </jar>
 </target>
 
 <target name="run" depends="jar">
  <java fork="true" maxmemory="64m" jar="test.jar">
   <classpath path="${run.classpath}"></classpath>
   <jvmarg line="${Search.JVM.extra.args}"/>
   <arg value="Ant"/>
   <arg file="D:/rag"/>
  </java>
 </target>
</project>

 

Buildfile: D:/MyEclipse/workspace/sad/build.xml
compile:
jar:
      [jar] Updating jar: D:/MyEclipse/workspace/sad/test.jar
run:
     [java] Hello Ant
     [java] hello.dat
BUILD SUCCESSFUL
Total time: 875 milliseconds

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

 <target name="run" depends="jar">
  <java fork="true" maxmemory="64m" jar="test.jar"
   failonerror="false" >
   <classpath path="${run.classpath}"></classpath>
   <jvmarg line="${Search.JVM.extra.args}"/>
   <arg value="Ant"/>
   <arg file="D:/rag"/>
  </java>
 </target>

 

Buildfile: D:/MyEclipse/workspace/sad/build.xml
compile:
jar:
run:
     [java] java.lang.NullPointerException
     [java] at org.ant.chapter1.Hello.main(Hello.java:27)
     [java] Hello Ant
     [java] Exception in thread "main"
     [java] Java Result: 1
BUILD SUCCESSFUL
Total time: 984 milliseconds

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

 

使用Ant运行tomcat

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

<?xml version="1.0"?>
<project name="project" default="run">
 <target name="run">
  <exec executable="cmd">
   <arg value="/C a.bat"/>
  </exec>
 </target>
</project>

a.bat

@echo off
echo Hello >> a.txt

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

 

下面我们来运行tomcat

<?xml version="1.0"?>
<project name="project" default="tomcat-start">
 <property name="tomcat.dir" value="c:/Tomcat5"></property>
 
 <target name="tomcat-start">
  <exec dir="${tomcat.dir}/bin" executable="cmd">
   <env key="CATALINA_HOME" path="${tomcat.dir}"/>
   <arg value="/C startup.bat"/>
  </exec>
 </target>
 <target name="tomcat-stop">
  <exec dir="${tomcat.dir}/bin" executable="cmd">
   <env key="CATALINA_HOME" path="${tomcat.dir}"/>
   <arg value="/c shutdown.bat"/>
  </exec>
 </target>
</project>

 

相关文章推荐

ply 蚂蚁模型 ant

  • 2015年12月17日 17:06
  • 24KB
  • 下载

bzoj2023【Usaco2005 Nov】Ant Counting 数蚂蚁

滚动数组+前缀和优化DP

蚂蚁与蚱蜢(The Ant and the Grasshopper)

当我还是一个小孩的时候,我背诵了La Fontaine写的一些寓言,从各个寓言中得出的教训都详细地为我作了解释。我学到的之一便是《The Ant and theGrasshopper》,它被修改用于告...
  • zhouzxi
  • zhouzxi
  • 2012年04月25日 16:53
  • 6627

Bzoj[2023/1630]: [Usaco2005 Nov]Ant Counting 数蚂蚁 DP+滚动数组

2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 180  Solv...
  • Oakley_
  • Oakley_
  • 2016年08月26日 09:28
  • 335

蚂蚁回家(我是这样理解)Walking Ant (BFS)

Problem Description Ants are quite diligent. They sometimes build their nests beneath flagstones. H...

Eclipse Ant(蚂蚁)

功能描述:      ant主要用来『编译,测试,打包,部署』如何使用+ project   - name            项目名称  - default          默认target n...

从蚂蚁的觅食过程看团队研发(转载)

我常常想,我们整天工作着,忙碌着,日复一日,年复一年,也看着别人和我们一样在工作着,忙碌着,我们甚至没时间停下来思考,你忙,我忙,他也忙,看起来,我们的团队,我们的部门就像一群忙忙碌碌的蚂蚁。其实,我...

做管道建设者还是提桶者?做打工者,还是创业者?蝗虫还是蚂蚁?【转载:1876次】

换个想法,往往就可以换个活法。花上几分钟看看,你命运或许在此转折!!  我们为您准备了一则小故事,帮助您开启智慧的大门: 听说过蚂蚁和蝗虫的寓言吗?蚂蚁利用夏天的一部分时间为即将来临的冬天储存粮食。...

树莓派(raspberry pi)学习12: 树莓派创意无限,无所不能

英国剑桥大学6名电脑专家感慨电脑和手机功能太强大,让孩子坐享其成,以至丧失动手创造的乐趣,于是设计出一款名为树莓派(Raspberry Pi)的可编程电脑。 极客们创意无限,让树莓派无所...
  • c80486
  • c80486
  • 2013年01月03日 15:00
  • 6926

让Android手机变得无所不能-几种很有创意的Android外设展示

随着Android智能机的日渐普及,Android已经融入大家的日常生活中,并展现了强大的能力,如google地图、语音搜索等。 谷歌公司于2011年5月10日在美国旧金山举行的开发者会议“Googl...
  • nwtel
  • nwtel
  • 2012年10月18日 18:55
  • 1940
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转载] 无所不能的“蚂蚁”--Ant
举报原因:
原因补充:

(最多只允许输入30个字)