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檔案的寫法每個公司都有不同,這裡沒有太大的參考價值,所以略去。(全文完)