Apache Ant 是一个基于 Java 的开放源代码构建实用工具。人们常把它与 Make 进行比较, Make 长期以来一直用于帮助自动完成构建过程。经过不同版本的改进, Ant 已发展成一个丰富的功能库,使其成为适用于许多场合的合适工具。例如, Ant 的当前版本提供的一些任务包括了操作文件内容、执行命令行和 Java 程序以及启动 SSH 和 FTP 连接的功能。
由于定义所有构建逻辑的 Ant 构建文件都是用 XML 编写的,因此,如果需要更改逻辑,则不需要重新编译代码,也不需要了解语言特定的语法。此外, Ant 具有高度的可扩展性。它提供了使用 Java™ 创建您自己的自定义任务的功能,之后又可以通过与使用任何其他 Ant 任务相同的方式使用 Java™ 。所有这些联系在一起意味着 Ant 是可以执行很多任务的极好选择。
在大多数情况下,一旦创建好构建文件,就可以从带有适当目标 ( 例如, ant dist) 的命令行调用 Ant 可执行文件来执行它们,也可以使用一些 IDE 工具如 : Eclipse 内置 Run Ant 命令来执行它们。然而, 也存在更适合于从 Java 程序中启动 Ant 的情况 。这可能要根据 Java 程序检测到的某组条件来开始一系列的操作,或者,它只是利用程序内丰富的 Ant 内置功能。在这种情况下,您需要继续创建一个构建文件,就像从命令行调用 Ant 时那样,但之后您需要将对 Ant Java API 的正确调用插入到程序中。本文将通过检查必要的 Java 代码并向您展示如何在 Eclipse 内运行此代码来帮助您处理此过程。
下面我们开始一个简单例子的开发:
1 .首先在 eclipse 下创建一个工程,如图:
1.1 在 src 目录下创建一个 build.xml 文件 , 输入如下内容:
<?xml version="1.0"?>
<project name= "testproject" default= "test" basedir= "." >
<target name= "test" >
<echo message= "Hello ${name}" />
</target>
</project>
<project> 标签代码一个需要构建的项目, <target> 是项目构建中的一个目标,在这里为了简单,我只为工程添加了一个目标。通过代码调用,执行该目标。
测试 build.xml 文件是否合法,右键 build.xml 文件,选择 Run As --- ant build , 在控制台出现如下信息:
Buildfile: D:/eclipse-SDK-3.4-win32/project/ant_project/src/build.xml
test :
[ echo ] Hello world
BUILD SUCCESSFUL
Total time: 203 milliseconds
代表 build.xml 文件是合法的,如是出现 BUILD FAILED 字样,刚需要调试 build.xml ,保证其是一个正确的 xml.
1.2 在编写代码之前我们需要导入如下包:
Ant1.7 我资源包中 lib 中存放这些 jar 包
1.3 在 com.sntt.ant.antprj 包中创建一个 AntSample 类 , 输入如下代码:
package com.sntt.ant.pro;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
public class AntSample {
public static void main(String[] args) {
File buildFile=new File(".//src//build.xml");
// 创建一个 ANT 项目
Project p=new Project();
// 创建一个默认的监听器 , 监听项目构建过程中的日志操作
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try{
p.fireBuildStarted();
// 初始化该项目
p.init();
ProjectHelper helper=ProjectHelper.getProjectHelper();
// 解析项目的构建文件
helper.parse(p, buildFile);
// 执行项目的某一个目标
p.executeTarget(p.getDefaultTarget());
p.fireBuildFinished(null);
}catch(BuildException be){
p.fireBuildFinished(be);
}
}
}
右键运行该类文件,会在控制台再现如下信息:
test:
[echo] Hello world
BUILD SUCCESSFUL
Total time: 0 seconds
说明我们使用 java 代码实现 ANT 中目标调用。
代码注解:
创建一个新的 Project 对象。 Project 是 Ant 用于表示带有其所有 目标、任务和属性 的 Ant 项目的 Java 类。它初始化此项目 ; 这将导致该项目执行某一内部安装程序。然后,它定位缺省的 ProjectHelper( 是一个使用 XML 文件配置整个项目的类 ) ,并使用该 ProjectHelper 分析此构建文件,并将来自构建文件的信息填充到项目中。接下来,它将执行此项目的缺省目标。
您还可以通过传递目标名称,例如 p.executeTarget("test") ,来执行此构建文件中的任何目标 ( 在此构建文件中,碰巧只有一个目标 ) 。 即使所有这些操作都成功完成,您仍看不到任何输出,因为 Ant 不知道应将结果输出到哪里。当通过命令行或 eclipse 执行 Ant 时,输出将自动转到控制台。但是此处您需要明确指出。您需要添加一个 BuildLogger 作为 侦听器 ,这样,它就可以 接收构建过程中发出的事件通知。
记录器
您可以使用几种不同的 BuildLogger ,包括 DefaultLogger 、 AnsiColorLogger 、 MailLogger 和 NoBannerLogger 。您也可以编写自己的 BuildLogger ,并将其注册到项目中。事实上,您可以注册实现 BuildListener 接口的任何类,以接收构建事件,并对您的类中的这些构建事件做出响应 ( 例如,接收一个 taskCompleted 事件,并增加进度栏 ) 。对于这种情况,请注册最简单的记录器和 DefaultLogger ,并将输出消息直接输出到标准输出,将错误消息直接输出到标准错误。要做到这一点,所以在创建项目之后初始化项目之前添加以下代码行 :
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
构建事件
虽然您现在正在获取输出,但却没有获取关于 构建操作是否成功完成或者构建的运行时间 的任何信息。最终您还需要激发某些事件,以让 Ant 知道正在启动构建,并且已完成。您还需要将 execute() 方法抛出的任何 异常加入到 fireBuildFinished 方法中,以便能够传递到侦听器 。添加此代码后,主方法如下所示 :
File buildFile = new File("build.xml");
Project p = new Project();
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try {
p.fireBuildStarted(); // 项目开始构建
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());
p.fireBuildFinished(null); // 构建结束
} catch (BuildException e) {
p.fireBuildFinished(e); // 构建抛出异常
}
右键单击类文件中的任何位置,并选择 Source => Organize Imports ,然后保存。此时,如果您运行此代码,就会看到所希望的输出。要更改输出中的信息数量,请更改消息输出级别 ( 而不是尝试更改 Project.MSG_VERBOSE) 。
属性
就像在任何其他 Ant 构建文件中一样,您可以定义属性或将属性文件导入到此构建文件中。但可能存在这样的情况,即您希望以编程方式提供这些属性,或覆盖构建文件中的值。编辑 build.xml 文件并将 Hello World 替换为 Hello ${name} 。正是这个语法告诉 Ant 在运行时执行变量替换。保存文件。
如果再次运行您的程序,您将看到该程序输出 “Hello ${name}” ,因为尚未设置此变量 “name” 的值。在 AntSample.java 中,在创建此 Project 对象的位置的下面添加以下行 :
p.setProperty("name", "Bob");
保存文件。现在再次运行 Run As --- Ant build 。您应看到如下输出
test:
[echo] Hello Bob
BUILD SUCCESSFUL
Total time: 1 second
您甚至可以在回显任务之前将行 添加到 build.xml 文件中,但这不会产生任何变化。以编程方式设置的属性将始终覆盖在构建文件中设置的属性。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/buptdavid/archive/2009/11/16/4816649.aspx