我们分别采用命令行与Ant两种不同的build方式。
1. 命令行
首先,创建src目录:
其次,创建bin目录,编译并运行:
javac -sourcepath src -d bin\ src\HelloWorld.java
java -cp bin HelloWorld
再次,创建exe目录,创建jar包,包含创建manifest文件,exe目录,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。
< delete dir = ” bin ” / >
< delete dir = ” exe ” / >
< /target >
compile
compile创建目录bin,编译src目录源文件,生成的.class文件放在bin目录。
< mkdir dir = ” bin ” / >
< javac srcdir = ” src ” destdir = ” bin ” / >
< /target >
jar
jar创建目录exe,打包jar。使用manifest元素可轻松创建manifest文件。
< mkdir dir = ” exe ” / >
< jar destfile = ” exe/HelloWorld.jar ” basedir = ” bin ” >
< manifest >
< attribute name = ” Main-Class ” value = ” HelloWorld ” / >
< /manifest >
< /jar >
< /target >
run
run 运行jar。
< 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 = ” B ” depends = “ A “ / >
< target name = ” C ” depends = “ B “ / >
< target name = ” D ” depends = “ C,B,A “ / >
对于我们的工程HelloWorld。可以运行下列Ant命令。
ant compile
ant jar
ant run
当然,可以简单地运行
build.xml清单如下:
< 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. 创建目录:
Mkdir mkdir=new Mkdir();
mkdir.setProject(prj);
mkdir.setDir(new File("src"));
mkdir.execute();
2. 将class文件打成jar包
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,目的是在Java控制台打印一条消息。该Task只有一个属性,称为message。
源代码MyTask.java
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;
}
}