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 文件中,但这不会产生任何变化。以编程方式设置的属性将始终覆盖在构建文件中设置的属性。