`
夜乡晨
  • 浏览: 36285 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

以编程方式调用 Apache Ant

阅读更多
从 Java 代码使用 Ant 构建文件
引言

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.jar 和 xmlParserAPIs.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 的旧版本

本文本中的代码适用于 Apache Ant 1.5 或更高版本。如果需要使用 Ant 的旧版本,您需要做一些更改。首先,替换以下代码:

ProjectHelper helper =
ProjectHelper.getProjectHelper();
helper.parse(p, buildFile);


您需要使用下面的代码(现已弃用)来达到相同的效果:

Project.configureProject(p, buildFile);


其次,在 Ant 的版本 1.4 中,激发事件的方法受到保护。如果您只需使用 1.4 或更早期的版本,您完全可以忽略这些方法。但是,如果您需要使用 1.4 到 1.6+ 的版本,则需要扩展 Project 类来公开这些方法,然后使用您自己的 Project 类。

属性

就像在任何其他 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)。

参考资料

    * 您可以参阅本文在 developerWorks 全球站点上的 英文原文。

    * Apache Ant 网站是提供关于 Apache Ant 的文档以及获得 Ant 的更新版本的最佳资源。

    * 文章 Java Software Automation with Jakarta Ant(OnJava,2002 年 8 月)现已过时,但是如果您正在使用 Ant 的旧版本,那么这篇文章可能有用。

    * 通过参与 developerWorks blogs 加入到 developerWorks 社区。

    * 购买打折的 WebSphere 书籍。

    * 查找关于 WebSphere Studio Application Developer 的更多信息。

关于作者

Nell Gawor 在北卡莱罗纳州的三角研究工业园 (Research Triangle Park) 工作,她是 IBM Software Group System House Advanced Technology Group 的一名助理软件工程师。她获得了伊利诺大学香槟分校 (University of Illinois at Urbana-Champaign) 的计算机科学硕士学位。您可以通过 ngawor@us.ibm.com与她联系。

建议
分享到:
评论

相关推荐

    Apache Ant入门教程

    C 或 C++ 中的传统项目经常使用 make 工具来做这件事情,其中生成任务是通过调用 shell 命令来执行的,而依赖关系定义在每个生成文件之间,以便它们总是以必需的顺序执行。 Ant 与 make 类似,它也定义生成文件之间...

    Java 代码调用ANT

    Java 代码调用ANTJava 代码调用ANTJava 代码调用ANT

    apache-ant-1.9.3-src.tar

    在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。 Ant的优点 Ant是Apache软件基金会JAKARTA目录中的...

    java代码调用ant执行类

    java代码调用ant执行类,供参考java代码调用ant执行类,供参考

    apache-ant-1.9.6

    Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。 简介 用户群:大多数的Java设计都被用于管理大量信息流,例如纽约州就...

    apache-ant-1.10.3

    Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。 简介 用户群:大多数的Java设计都被用于管理大量信息流,例如纽约州就...

    org.apache.tools.*需要的ant.jar包

    java调用ant构建打包,java调用ant构建打包,java调用ant构建打包,java调用ant构建打包,

    Java调用Ant API用法收集

    介绍了使用Java调用Ant API进行文件部署操作等常用的用法。

    客户端编程方式调用webservice

    java代码模块调用webservice

    apache-ant-1.10.8.zip

    Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以和容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,...

    ant调用java类

    ant调用java类 工作中使用的,先提要出来,提供学习

    ant使用指南.pdf

    (build file)的基本结构,并学习如何调用这个工具。我们将逐步完成为一个简单 Java 项目编 写生成文件的步骤,然后考察 Ant 的其他一些有用功能,包括文件系统操作和模式匹配。最后编写 一个扩展 Ant 功能的自己的...

    Java Ant 互相调用

    NULL 博文链接:https://yxhcquedu.iteye.com/blog/824921

    java调用ant下载项目文件

    ant java svn 下载 使用java代码调用ant 下载SVN上的项目 ant中的build.xml文件

    delphi编程MDI方式调用DLL.rar

    有很多朋友问MDI方式调用DLL的问题,回答的多了给大家做了一个例子,这是在delphi5开发人员指南的源码上修改的,里面注释了源码的一些东西,希望对大家有帮助

    VC++调用Matlab编写的DLL(混合编程)

    是我的CSDN博客中文章“VC++调用Matlab编写的DLL(混合编程)”的配套实例。资源中的源程序实现了VC++中在VS2008中进行VC和matlab的混合编程,在vc程序中调用自己编写的matlab绘图DLL。请先仔细阅读我的CSDN博客中...

    精彩编程与编程技巧-如何调用控制面版中的应用程序...

    精彩编程与编程技巧-如何调用控制面版中的应用程序 ...

    实验五Linux系统调用的编程技术

    2仔细分析汇编代码调用系统调用的工作过程,特别是参数的传递方式等。 3总结部分需要阐明自己对“系统调用的工作机制”的理解。 实验条件: 1、装有Linux操作系统的微型计算机; 实验过程 系统调用的库函数就是读者...

Global site tag (gtag.js) - Google Analytics