以编程方式调用 Apache Ant

IBMdW 发布于 2012/01/04 12:48
阅读 456
收藏 3

Apache Ant 是一个基于 Java 的开放源代码构建实用工具。人们常把它与 Make 进行比较,Make 长期以来一直用于帮助自动完成构建过程。经过不同版本的改进,Ant 已发展成一个丰富的功能库,使其成为适用于许多场合的合适工具。例如,Ant 的当前版本 (V1.6.2) 提供的一些任务包括了操作文件内容、执行命令行和 Java 程序以及启动 SSH 和 FTP 连接的功能。

由于定义所有构建逻辑的 Ant 构建文件都是用 XML 编写的,因此,如果需要更改逻辑,则不需要重新编译代码,也不需要了解语言特定的语法。此外,Ant 具有高度的可扩展性。它提供了使用 Java™ 创建您自己的自定义任务的功能,之后又可以通过与使用任何其他 Ant 任务相同的方式使用 Java™。所有这些联系在一起意味着 Ant 是可以执行很多任务的极好选择。

在大多数情况下,一旦创建好构建文件,就可以从带有适当目标(例如,ant dist)的命令行调用 Ant 可执行文件来执行它们,也可以使用 WebSphere® Studio Application Developer (Application Developer) 内置 Run Ant 命令来执行它们。然而,也存在更适合于从 Java 程序中启动 Ant 的情况。这可能要根据 Java 程序检测到的某组条件来开始一系列的操作,或者,它只是利用程序内丰富的 Ant 内置功能。在这种情况下,您需要继续创建一个构建文件,就像从命令行调用 Ant 时那样,但之后您需要将对 Ant Java API 的正确调用插入到程序中。本文将通过检查必要的 Java 代码并向您展示如何在 Application Developer 内运行此代码来帮助您处理此过程。

本文只包括使用构建文件从 Java 中调用 Ant 任务的情况。有关此过程的更多信息,请参阅《Apache Ant 用户手册》中的 Using Ant Tasks Outside of Ant

以编程方式调用 Ant

本文中的示例使用 WebSphere Studio Application Developer 5.1.2。这些示例可能也适用于其他版本,但尚未经过测试。您可以下载免费试用版本。

从 Application Developer 中创建 Ant 构建文件

在本文中,我们将简要地回顾构建文件的创建以及其他 Ant 基础知识,但并不详细讨论。有关详细信息,请参阅相关内容和参考资料部分。

首先,创建一个新的 Java 项目。转到 File => New => Project。选择 Java => Java Project 并单击 Next。输入 antSample 作为项目名称,然后单击 Finish。如果系统询问您是否要切换到 Java 透视图,单击 Yes


图 1:创建新的 Java 项目
图 1:在 Application Developer 中创建新的 Java 项目

现在创建一个简单的 Ant 构建文件,以便您可以对调用进行测试。Ant 构建文件只是一个 xml 文件,因此右键单击 antSample 项目,并选择 New => Other...。然后选择XML => XML 并单击 Next。选择 Create an XML file from scratch,然后单击 Next。将您的文件命名为 build.xml,然后单击 Finish


图 2:构建文件创建后的包浏览器
图 2:构建文件创建后的包浏览器

将以下代码复制到 xml 文件中,以创建一个简单的构建文件。

<project name="testproject" default="test" basedir=".">
	<target name="test">
		<echo message="Hello World" />
	</target>
</project>

保存文件。要验证它是否是一个有效的构建文件,请使用 Application Developer 的内置 Ant 来运行它。在 Package Explorer 中右键单击 build.xml 文件,并选择 Run Ant...。目标“test”应已选中以待运行,因为它是缺省目标,因此单击 Run。您应在控制台中看到如下输出:

Buildfile: C:\tempWorkspace\antSample\build.xml
test:
        [echo] Hello World
BUILD SUCCESSFUL
Total time: 4 seconds

创建类来调用 Ant

既然您已验证构建文件的正确性,那么您需要创建一个可以用于通过 Ant Java API 调用此构建文件的 Java 类。右键单击 antSample 项目,并选择 New => Class。输入 AntSample 作为此类的名称,并选中 Which method stubs would you like to create? 问题下 public static void main(String[] args) 旁边的复选框。单击 Finish,系统将创建您的 AntSample 类及其主方法。

由于您将使用 Ant API,因此接下来您需要将 JAR 文件 Ant 需求添加到类路径中。右键单击 antSample 项目,并从菜单中选择 Properties。单击 Java Build Path,选择 Libraries 选项卡,然后选择 Add External Jars...。定位您安装 WebSphere Studio 的文件夹,然后导航到 eclipse => plugins => org.apache.ant_1.5.3。选择 ant.jar 并单击 Open。再次选择 Add External Jars...,然后导航到 eclipse => plugins => org.apache.xerces_4.0.13

选择 xerces.jarxmlParserAPIs.jar,然后再次单击 Open。现在,您的构建路径应如下所示:


图 3:新的 Java 构建路径
图 3:新的 Java 构建路径

单击 Properties 对话框上的 OK,返回到您的 AntSample 类。将以下代码添加到 AntSample 的主方法中:

File buildFile = new File("build.xml");
Project p = new Project();
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());

右键单击文件中的任何位置,并选择 Source => Organize Imports。这将清除任何错误。保存此文件。

通过在 Package Explorer 中高亮显示 AntSample.Java,然后转到 Run => Run As => Java Application 来运行此代码。如果切换到此控制台,您将看到此程序正常运行和退出,但它不会产生任何输出。

为了找出原因,让我们检查一下代码,看看它在做什么。首先,它从构建文件创建一个文件对象,然后创建一个新的 Project 对象。Project 是 Ant 用于表示带有其所有目标、任务和属性的 Ant 项目的 Java 类。它初始化此项目;这将导致该项目执行某一内部安装程序。然后,它定位缺省的 ProjectHelper,并使用该 ProjectHelper 分析此构建文件,并将来自构建文件的信息填充到项目中。接下来,它将执行此项目的缺省目标。

您还可以通过传递目标名称,例如 p.executeTarget("test"),来执行此构建文件中的任何目 标(在此构建文件中,碰巧只有一个目标)。即使所有这些操作都成功完成,您仍看不到任何输出,因为 Ant 不知道应将结果输出到哪里。当通过命令行或 Application Developer 执行 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);

请注意,可以将此消息输出配置为几种不同的级别。右键单击此类文件中的任何位置,并选择 Source => Organize Imports,然后保存。现在,通过转到 Run 菜单并选择 Run Last Launched 来再次运行该程序。您将看到,您正在获取一些输出,但它们与您之前获取的输出并不完全相同。您现在在控制台中看到的输出应为:

test:
     [echo] Hello World

构建事件

虽然您现在正在获取输出,但却没有获取关于构建操作是否成功完成或者构建的运行时间的任何信息。最终您还需要激发某些事件,以让 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 在运行时执行变量替换。保存文件。

如果再次运行您的程序 (Run => Run Last Launched),您将看到该程序输出“Hello ${name}”,因为尚未设置此变量“name”的值。在 AntSample.java 中,在创建此 Project 对象的位置的下面添加以下行:

p.setProperty("name", "Bob");

保存文件。现在再次运行 AntSample (Run => Run Last Launched)。您应看到如下输出:

test:
     [echo] Hello Bob
BUILD SUCCESSFUL
Total time: 1 second

您甚至可以在回显任务之前将行 <property name="name" value="Sally" /> 添加到 build.xml 文件中,但这不会产生任何变化。以编程方式设置的属性将始终覆盖在构建文件中设置的属性。

结束语

既然您掌握了基础知识,那么学习更多知识的最好方法就是亲自实践 Ant javadoc 以展开您所做的工作。遗憾的是,Ant javadoc 不是 Application Developer 的一部分,并且不能用于在 Apache Ant 网站上进行在线浏览。这将确保您正在查看与您的 Ant 版本相匹配的 Javadoc。为了获得这些 Javadoc,您需要从 http://archive.apache.org/dist/ant/binaries/ 下载 Apache Ant V1.5.3(Application Developer 5.1.2 附带的版本)。之后,将这些 Javadoc 存放在 ANT_HOME\docs\manual\api 中。如果希望使用比 Application Developer 5.1.2 所附带的版本更新的 Ant 版本,请搜索 Application Developer 帮助以找到“升级 Ant”(Upgrading Ant) 或“使用不同版本的 Ant”(Using a Different Version of Ant)。

文章出处: IBM developerWorks
加载中
返回顶部
顶部