技术开发 频道

Apache Ant对决Make:实战Java构建工具

    我们分别采用命令行与Ant两种不同的build方式。

  1. 命令行

  首先,创建src目录:  

md src

  其次,创建bin目录,编译并运行:

  md bin

  javac
-sourcepath src -d bin\ src\HelloWorld.java

  java
-cp bin HelloWorld

  再次,创建exe目录,创建jar包,包含创建manifest文件,exe目录,jar打包。一个命令就可以搞定: 

echo Main-Class: HelloWorld>MonManifest md exe jar cfm exe\HelloWorld.jar MonManifest -C bin .

  最后,运行工程:

java -jar exe\HelloWorld.jar

  2. Ant

  Ant的构建脚本文件build file是使用XML语言编写,下文我们简称为build.xml。build.xml包含一个标准的根节点Project,表示一个工程。每个build文件只允许定义一个Project元素。Project定义至少1个或多个Target,表示不同的模块。而Target又是一些列Task的集合,而每一个Task是一段可执行的代码。三者的关系如图表示。更多细节,请参见Apache Ant官方网站:http://ant.apache.org

  我们使用Ant来build工程HelloWorld。build.xml包含4个target:clean,compile,jar,run。

  clean

  clean清除所有的编译文件以及相关目录,这里为目录bin以及exe。

< target name = ” clean ” >

  
< delete dir = ” bin ” / >

  
< delete dir = ” exe ” / >

  
< /target >

  compile

  compile创建目录bin,编译src目录源文件,生成的.class文件放在bin目录。

< target name = ” compile ” >

  
< mkdir dir = ” bin ” / >

  
< javac srcdir = ” src ” destdir = ” bin ” / >

  
< /target >

  jar

  jar创建目录exe,打包jar。使用manifest元素可轻松创建manifest文件。

< target name = ” jar ” >

  
< mkdir dir = ” exe ” / >

  
< jar destfile = ” exe/HelloWorld.jar ” basedir = ” bin ” >

  
< manifest >

  
< attribute name = ” Main-Class ” value = ” HelloWorld ” / >

  
< /manifest >

  
< /jar >

  
< /target >

  run

  run 运行jar。 

< target name = ” run ” >

  
< java jar = ” exe/HelloWorld.jar ” fork =true/ >

  
< /target >

  需要指出的是,以上4个target的执行顺序上有依赖关系的。例如jar依赖于compile,run依赖于jar。Ant提供了属性depends来描述target之间的依赖关系。举个例子,假设执行D,由于D依赖于C,C依赖于B,B依赖于A,因此,从顺序上,先执行A,其次B,然后C,最后D。每个Target最多只能被执行一遍。

< target name = ” A ” / >

  
< target name = ” B ” depends = “ A “ / >

  
< target name = ” C ” depends = “ B “ / >

  
< target name = ” D ” depends = “ C,B,A “ / >

  对于我们的工程HelloWorld。可以运行下列Ant命令。

ant clean

  ant compile

  ant jar

  ant run

  当然,可以简单地运行

ant run

  build.xml清单如下:

 < project default = ” run ” >

  
< property name = ” src.dir ” value = ” src ” / >

  
< property name = ” bin.dir ” value = ” bin ” / >

  
< property name = ” jar.dir ” value = ” exe ” / >

  
< property name = ” main-class ” value = ” HelloWorld ” / >

  
< target name = ” clean ” >

  
< delete dir = ” ${bin.dir} ” / >

  
< delete dir = ” ${jar.dir} ” / >

  
< echo message = ” nettoyage termine ” / >

  
< / target >

  
< target name = ” compile ” depends = ” clean ” >

  
< mkdir dir = ” ${bin.dir} ” / >

  
< javac srcdir = ” ${src.dir} ” destdir = ” ${bin.dir} ” / >

  
< echo message = ” compilation terminee ” / >

  
< / target >

  
< target name = ” jar ” depends = ” compile ” >

  
< mkdir dir = ” ${jar.dir} ” / >

  
< jar destfile = ” ${jar.dir}/sdf.jar ” basedir = ” ${bin.dir} ” >

  
< manifest >

  
< attribute name = ” Main-Class ” value = ” ${main-class} ” / >

  
< / manifest >

  
< / jar >

  
< echo message = ” Creation du fichier Jar terminee ” / >

  
< / target >

  
< target name = ” run ” depends = ” jar ” >

  
< java jar = ” ${jar.dir}/sdf.jar ” fork =true/ >

  
< / target >

  
< / project >

  Eclipse提供Ant视图,可以很方便查看与编辑Ant脚本,如图:

  Ant API

  Ant的强大之处在于,不仅可以调用Ant脚本进行各种文件部署、管理工作,也可以调用Ant丰富的API,甚至扩展Ant API编程。举几个例子:

  1. 创建目录:

Project prj=new Project();

  Mkdir mkdir
=new Mkdir();

  mkdir.setProject(prj);

  mkdir.setDir(
new File("src"));

  mkdir.execute();

  2. 将class文件打成jar包

Project prj = new Project();

  Jar jar
= new Jar();

  jar.setProject(prj);

  jar.setDestFile(
new File("HelloWorld.jar"));

  FileSet fileSet
= new FileSet();

  fileSet.setProject(prj);

  fileSet.setDir(
new File("bin"));

  fileSet.setIncludes(
"**/*.class");

  jar.addFileset(fileSet);

  jar.execute();

  创建自己的Task

  Apache Ant允许用户自定义Task,步骤如下:

  1. 创建一个类,继承org.apache.tools.ant.Task

  2. 对于每一个Attribute,需要实现标准的Java bean规范的set方法。

  3. 如果创建的Task需要其它其它的子Task,则需要实现org.apache.tools.ant.TaskContainer接口。

  4. 如果扩展的Task需要支持Text,需要实现方法public void addText(String)。

  5. 对于每个嵌套的元素,实现create, add或者addConfigured方法。

  6. 实现public void execute()方法。

  7. 在build.xml中使用引用自定义Task。

  举个例子,我们写一个自定义的Task,目的是在Java控制台打印一条消息。该Task只有一个属性,称为message。

  源代码MyTask.java

import org.apache.tools.ant.BuildException;

  import org.apache.tools.ant.Task;

  
public class MyTask extends Task {

  
private String msg;

  
// The method executing the task

  
public void execute() throws BuildException {

  System.out.println(msg);

  }

  
// The setter for the "message" attribute

  
public void setMessage(String msg) {

  this.msg
= msg;

  }

  }

 

0
相关文章