java的build工具―ant应用指南(3)
在自己的程序中调用ant
ant的任务其实就是一段功能代码。ant内置的大量任务对于我们开发java应用具有非常大的意义,为什么我们不能直接使用呢?
因为尽管在程序中调用ant的任务并不复杂,而且我们知道ant的任务其实都是一些java类,调用的方法无非就是执行这些类而已,不过在执行之前需要对它做一些初始化的工作,所以我们需要引用一个task类的子类来实现这个功能,比如如下代码:
package com.sharetop.antdemo;
import org.apache.tools.ant.*;
import org.apache.tools.ant.taskdefs.*;
import java.io.file;
public class runanttask {
public runanttask() {
}
public static void main(string args[]){
antjar j = new antjar();
j.setbasedir(new file("./classes"));
j.setjarfile(new file("aaa.jar"));
j.execute();
}
}
final class antjar extends jar {
public antjar() {
project = new project();
project.init();
tasktype = "jar";
taskname = "jar";
}
}
注意antjar类的构造方法,先创建了project并初始化它,这是直接调用task的必需条件。
如果要在自己的程序中执行ant,需要了解的是ant定义的几个buildevent,它包括:
◆ build started
◆ build finished
◆ target started
◆ target finished
◆ task started
◆ task finished
◆ message logged
我们需要做的是实现buildlistener接口来处理各种事件,而执行ant的方法与上面给的例子非常类似,以实际开发的antbuilder软件的部分代码为例:
public void buildtarget(string targetname,string buildfilename) {
try {
project p = new project();
p.init();
file f = new file(buildfilename);
p.setuserproperty("ant.file",f.getabsolutepath());
projecthelper.configureproject(p,f);
p.addbuildlistener(this);
if( targetname==null )
p.executetarget(p.getdefaulttarget());
else
p.executetarget(targetname);
}
catch (exception ex) {
jtextarea1.append(ex.getmessage());
}
}
创建project并初始化,设置它的配置文件(build.xml),执行它缺省的或指定的target,然后在实现了buildlistenser接口的监听器类中对你感兴趣的事件作处理,代码如下:
public void buildstarted(buildevent event){ /* nothing*/ }
public void buildfinished(buildevent event) { /* nothing*/ }
public void targetstarted(buildevent event) {
this.jtextarea1.append(event.gettarget().getname()+": /n/r");
}
public void targetfinished(buildevent event) {/* nothing*/ }
public void taskstarted(buildevent event) {/* nothing*/ }
public void taskfinished(buildevent event) { /* nothing*/ }
public void messagelogged(buildevent event) {
int prior = event.getpriority();
switch(prior){
case project.msg_err :
this.jtextarea1.append("["+event.gettask().gettaskname()+"]err:"
+event.getmessage());
break;
case project.msg_info:
this.jtextarea1.append("["+event.gettask().gettaskname()+"]"+event.getmessage
());
break;
case project.msg_warn:
this.jtextarea1.append("["+event.gettask().gettaskname()+"]"
+event.getmessage());
break;
case project.msg_verbose:
this.jtextarea1.append(event.getmessage());
break;
}
}
build.xml文件的写法每个公司都有不同,这里没有太大的参考价值,所以略去。(全文完)
闽公网安备 35060202000074号