内容


在 Eclipse 中轻松使用 Ant

在 Ant 编辑器中轻松编写、构建和调试代码

Comments

开始之前

关于本教程

Apache Ant 被认为是 Java™ 开发环境中最经典的构建工具。大多数合格的 Java 项目都以 Ant 构建脚本的形式附加有某些种类的定制构建过程。因此,每种有价值的 Java IDE 都必须为 Ant 内置有某些种类的支持。Eclipse 是一种受人喜爱的 IDE,它也不例外,为 Ant 提供广泛的内置支持。

了解如何使用 Eclipse 中的特性来编写和调试 Ant 文件,以及如何将 Ant 文件用作构建器(builder)。

前提条件

本教程假设读者具有创建 Ant 脚本和使用 Eclipse 平台的基本知识。

系统需求

要尝试本教程中的例子,您需要从 Eclipse.org 下载的 Eclipse SDK 运行在 Java Virtual Machine (JVM) V1.4 或更晚版本上。从 Sun MicrosystemsIBM 下载 Java 技术。

使用 Ant

创建新的 Ant 构建文件

首先向您的项目中添加一个新的 Ant 文件,本教程后面会用到这个项目。

  1. 打开 Package Explorer
  2. 右击任何 Java 项目并单击 New > File
  3. 在 New File 窗口中,键入 build.xml 作为文件名

文件创建好了,并且打开了 Ant 编辑器。现在,向该文件中添加一些内容。单击编辑器中的任何地方,并按 Ctrl+Space。出现一个帮助完成任务的窗口(见图 1),其中包含一个叫做 Buildfile template 的选项,该模板是一个带有两个目标的简单构建文件(buildfile)。单击这个模板,将一个包含两个目标的示例项目添加到该文件。

图 1. 使用 Buildfile 模板
使用 Buildfile 模板
使用 Buildfile 模板

有了一些内容以后,我们就来仔细看看 Ant 编辑器。

Ant 编辑器

了解 Ant 编辑器特性:突出显示、代码完成、折叠、重命名,以及标记出现和问题。

突出显示

为了易于使用,编辑器以不同颜色显示构建文件的每种元素。注释与属性以不同的颜色显示,等等。您甚至可以为每种元素类型定制颜色。

要更改突出显示的颜色,可完成以下步骤:

  1. 单击 Window > Preferences > Ant > Editor
  2. 单击 Syntax 选项卡
  3. 在结果页面上,为每种元素类型选择颜色

代码完成

Ant 编辑器提供全面的代码完成功能,能帮助您快速地键入 Ant 构建文件。在一个目标定义内单击,然后按 Ctrl+Space,会看到所有可用任务的一个列表。您选择一个任务之后,编辑器会自动插入开始标记和结束标记(见图 2)。

图 2. 任务列表
任务列表
任务列表

但是并不止于此。Ant 编辑器的代码完成功能远远不只是自动标记插入。编辑器知道我们的构建文件中定义的目标。所以,比如说当我们想要插入一个目标的名称时,也就是说键入项目的 default 属性或者目标的 depends 属性,按 Ctrl+Space 将显示我们可以填充的所有可用目标的一个列表(见图 3)。

图 3. 可用的目标
可用的目标
可用的目标

编辑器甚至知道我们的构建文件中定义的属性。所以,当我们键入一个属性的值时,在键入初始的 $(美元符号)之后,我们可以按 Ctrl+Space 来看构建文件中定义的所有属性的列表 所有系统属性(见图 4)。

图 4. 可用属性的列表
可用属性的列表
可用属性的列表

Ant 编辑器中的另一个代码完成特性是 Code 模板(见图 5)。当使用 Buildfile 模板向构建文件添加示例内容时会用到 Code 模板。Ant 编辑器中有几个可用的 Code 模板,利用这些模板,可以快速地输入目标定义、属性定义,等等。注意,在我们应用一个模板之后,在编辑器自动填充的文本上将出现一个方框(见图 6)。这些方框实质上是用于执行一些空格填充。它们允许我们键入文本,比如目标的名称及其依赖关系。我们可以使用 Tab 键在模板中的空格之间循环。

图 5. Code 模板在发挥作用
Code 模板在发挥作用
Code 模板在发挥作用
图 6. 应用模板
应用模板
应用模板

折叠

Ant 编辑器可以把所有的 Extensible Markup Language (XML) 元素都折叠在我们的构建文件中。只要单击左边的 +- 按钮,就可以展开或折叠各种元素。该功能很有用,因为利用该功能可以快速查看文件的内容。将鼠标悬停在 + 按钮上,一个上下文窗口将显示元素的内容。

重命名

Ant 编辑器的一个真正伟大的特性是 Rename in File 特性。使用该特性,可以在整个文件中重命名目标和属性的名称(见图 7)。例如,假设我们想要重命名一个目标。右击该名称,然后单击 Rename in file。引用了该目标名称的整个文件中将会出现方框。现在我们可以编辑该目标的名称,更改将会反映到整个文件中。该特性甚至也适用于属性名称。

图 7. 重命名目标
重命名目标
重命名目标

标记出现

单击顶部的 Toggle mark occurrences 按钮可打开或关闭 Mark Occurrences 特性。若该特性是打开的,那么当我们单击任何目标或属性的名称时,整个文件中该目标或属性的所有出现都会被突出显示(见图 8)。

图 8. 标记目标的出现
标记目标的出现
标记目标的出现

只显示所选择的元素

单击 Show selected elements only 按钮(见图 9)只会显示所选择的元素。当我们必须编写一个大的目标定义,但是不想看到混乱的情况时,该功能尤其有用。我们可以单击该按钮来使得其他的文件元素消失,从而将注意力集中于当前目标。

图 9. 只显示当前目标
只显示当前目标
只显示当前目标

标记问题

Ant 编辑器可以在我们键入内容时显示构建文件中的错误和警告。这有助于及早识别构建文件中的错误和潜在的问题,而不是等到以后再去找出构建期间出现错误的原因。

要看到该特性发挥作用,转到 build.xml 中的 project 标记。在 default 目标的值中,键入构建文件中不存在的目标的名称。会出现一个带红色波浪线记号(marker)的 project 标记(见图 10)。将鼠标悬停在波浪线记号上,会出现一个窗口,指出默认的目标不存在于该项目中。一个红色的 X 图标将出现在记号的左边。

图 10. Ant 编辑器显示一个错误
Ant 编辑器显示一个错误
Ant 编辑器显示一个错误

另外注意编辑器窗口右边的条形区域(bar)。这里显示文件中的所有错误和警告。一旦错误或警告出现在文件中,一个相应的红色或黄色记号就会放在条形区域的适当位置。单击记号导航到错误的位置。这可以让我们观察到文件的什么地方有错误或警告以及有多少,从而可以容易地导航到这些错误或警告。在条形区域的顶部也有一个方框,它在文件中出现错误时就会变红。因此,只要看看这个方框,就可以立即确定文件是否正确。

通过完成以下步骤,我们可以更改 Ant 编辑器处理问题的方式。

  1. 单击 Window > Preferences
  2. 展开 Ant,然后展开 Editor
  3. 在 Preferences 窗口,单击 Problems 选项卡(见图 11)。
    图 11. 配置问题如何出现在 Ant 中
    配置问题如何出现在 Ant 中
    配置问题如何出现在 Ant 中
  4. 选择我们的选项。选中 Ignore all buildfile problems 复选框会完全禁用错误检查。默认情况下,Eclipse 将每个 XML 文件都看作 Ant 构建文件,所以它会试图查找这些文件中的错误。然而,如果您有一些 XML 文件,并且不想对它们检查错误,那么请在 Names 框中指定它们的名称。

    Names 框下面,可以看到 Ant 编辑器可以检测的错误种类,我们可以分别为这些种类设置苛刻程度:Ignore、Warning 和 Error。从错误类型边上的列表选择 Warning 将指出可能 创建潜在问题的代码。选择 Error 指出代码明确 具有的问题的类型。如果您觉得有些问题限制您编写代码的方式,您可以选择 Ignore,尽管我不推荐这么做。

注意:条形区域也适用于 Mark Occurrences 特性。打开 Mark Occurrences 并单击任何目标名称。对应于每个引用的位置,条形区域具有一些小小的黄色记号。单击记号导航到该引用。

导航构建文件

Eclipse 提供几种方法来帮助容易地导航巨大的构建文件。例子包括超链接和功能键导航,以及两个视图:Outline 和 Ant。

超链接和功能键导航

Ctrl 键,并将鼠标悬停在任何目标或属性的名称上。名称就变成了超链接(见图 12)。单击该超链接会把我们带到该目标或属性的声明。

图 12. 目标引用变成超链接
目标引用变成超链接
目标引用变成超链接

我们也可以按 F3 来转到该目标或属性的声明。通过展开 General,然后展开 Keys 以访问 Keys preferences 页面,可以更改快捷键。

Outline 视图

顾名思义,Outline 视图展示构建文件的整个大纲(见图 13)。我们可以容易地看到文件中定义的所有目标和属性。内部目标和公共目标具有不同的图标,因而很容易区分。甚至默认的目标也突出显示了。展开任何目标将显示该目标中的所有任务。单击 Outline 视图中的任何元素可直接导航到该元素。视图顶部有几个按钮,通过这些按钮可以进行过滤,即对条目进行排序或者隐藏内部目标、属性、导入的元素和顶层元素。

图 13. Outline 视图
Outline 视图

我们也可以从 Outline 视图运行和调试目标。为此,右击 Outline 视图中的一个目标,然后单击 Run As(或 Debug As> ANT Build

Ant 视图

很多时候,您会发现自己在处理多个项目中的多个脚本。所以取代在 Navigator 或 Package Explorer 视图中或者在 External Tools 工具栏列表中寻找构建文件,Eclipse 工作人员创建了 Ant 视图,使得一切一目了然(见图 14)。

图 14. Ant 视图
Ant 视图

首先,单击 Window > Show View > Other > Ant > Ant 打开 Ant 视图。在刚打开时,视图是空的,所以我们必须向其中添加一些构建文件。单击 + 按钮打开一个窗口,在该窗口中,我们可以从工作区中打开的项目选择构建文件。通过选择一个目标并单击 Run,或者通过右击目标并单击 Run as > Ant Build,来运行该目标。

我们也可以使用 Ant 的搜索特性来添加构建文件。单击工具栏上的 Flashlight 图标,就会出现一个窗口,我们可以在该窗口中指定将要搜索的文件的名称。可在文件名中使用特殊字符 *(星号)或 ?(问号)来分别代表任何字符串任何字符。例如,键入 build*.xml 会匹配所有以单词 build 打头的 XML 文件名。如果没选中 Include buildfile containing errors 复选框,包含错误的文件就不会被选择。最后,可以选择在整个工作区中搜索还是只在一个工作集中搜索。

要从 Ant 视图删除文件,可选择该文件并单击 Remove。单击 Remove All 将清除整个视图。

Ant 视图与 Outline 视图之间的区别

很多人在第一次打开 Ant 视图时,会把它误认为是带有多个文件的 Outline 视图。但是两者之间其实存在着好些细微的区别。Outline 视图设计来帮助我们导航当前文件,而 Ant 视图则用于管理多个构建脚本中的多个目标的运行和调试,这些构建脚本可能分布于整个工作区内。

当我们详细了解两个视图中提供的特性时,这一基本区别将更为明显。

  • 我们可以向 Ant 视图添加多个文件,而 Outline 视图只显示当前文件的大纲。
  • 在 Outline 视图中双击一个目标将会导航到编辑器中的相应声明,而在 Ant 视图中这么做会实际运行该目标。
  • Ant 视图不显示任何属性或顶层元素,因为我们无法 “运行” 属性。
  • Outline 视图和 Ant 视图都包含 Hide internal targets 按钮,单击该按钮可以隐藏所有不是公共的目标,但是两种视图提供该按钮的目的不同。所以,Outline 视图提供该按钮只是作为另一种过滤视图的方式,而 Ant 视图提供该按钮是因为我们通常只会运行公共的目标,它使得从视图隐藏内部目标变得有意义。

调试 Ant 文件

您实际上可以在 Eclipse 中像调试 Java 文件一样地调试 Ant 文件,所有标准的调试特性都可用。这可能是 Eclipse Ant 集成中最好的功能。

在目标中放置断点

就像对 Java 文件所做的一样,我们在目标中的代码行上放置断点,这些代码行调用了我们要单步调试的任务。要在代码行上放置断点,只要在代码行左边的灰色条形区域上单击即可。出现一个绿色的球,表明断点已经设置好(见图 15)。通过在 Breakpoints 视图中单击或禁用断点,可以临时地启用或禁用断点。被禁用的断点显示为白色的球。注意,与 Java 断点不同,我们不能在断点上设置命中次数或条件 —— 我们在调试 Ant 文件时不需要用到它们。

图 15. 构建文件中的代码行上设置的断点
构建文件中的代码行上设置的断点
构建文件中的代码行上设置的断点

调试构建文件

现在开始调试。在 Ant 视图或 Outline 视图中右击一个目标,然后单击 Debug As > Ant Build。与调试 Java 文件一样,当执行到达我们设置了断点的代码行时,构建文件就会暂停。

下面是重要的部分:单击 Debug 视图中的 Step Over 按钮,单步通过构建文件中的代码行,就像单步通过 Java 语句一样(见图 16)。当我们单步通过每个任务时,任务将被执行并产生输出,我们查看这个输出可以看到构建过程中出了什么错。Run to Line 功能也是可用的,所以我们可以右击一行代码并单击 Run to Line,以暂停构建文件的执行,直到到达这个特定的行才继续执行。这个过程类似于在一个一旦到达就会被删除的代码行上设置临时断点。

图 16. 单步通过构建文件中的代码行
单步通过构建文件中的代码行
单步通过构建文件中的代码行

Debug 视图显示当前正在执行的任务的调用堆栈。如果一个任务调用另一个目标 —— 即 antcall —— 那么该目标就会出现在调用堆栈中的当前任务之上。

还有一个 Variables 视图是可用的(见图 17)。打开该视图可看到所有的 Ant 属性,这些属性是变量的 Ant 等价物。属性分组在三个部分中:

  • System properties:从系统中为构建设置的属性
  • User properties:诸如使用 -D 选项设置的属性
  • Runtime properties:在运行时设置的构建文件中定义的属性
图 17. Variables 视图显示所有属性
Variables 视图显示所有属性
Variables 视图显示所有属性

注意,与 Java 调试器不一样,Ant 调试器不允许我们更改 Variables 视图中显示的属性的值。

使用 Ant 构建文件作为项目构建器

在使用 Eclipse Java IDE 时,我们不知不觉也使用了 Java Builder。每当我们保存文件时,Java Builder 就会在后台默默地运行,并立即对这些文件进行编译。

尽管 Java Builder 似乎并不伟大,但是它是 Eclipse 最重大的特性之一:Java Builder 允许我们完全跳过编译过程,因为我们的程序总是 处于已编译状态,即使它充满了错误亦是如此。因此,我们可以在键入之后立即运行 Java 程序,无需首先通过一个漫长而乏味的编译过程。该功能为 Eclipse 用户省去了大量的时间和争论,也是 Eclipse 能够在程序员中广泛流行的原因之一。

但是如果我们想要做编译文件以外的事情呢?如果我们想要为整个项目创建一个 jar 文件,并且在每次修改项目时将该文件复制到一个特定的目录呢?如果我们想要所有这些都发生在后台,无需每次都告诉 Eclipse 呢?我们完全可以坐下来、放松、编写一些代码、喝杯咖啡,让 Eclipse 在后台处理复杂的构建过程,甚至无需知道这个过程正在后台进行。

听起来是不是像做梦呀?不是做梦。我们可以真正做到这样的事情。我们只需要将一个 Ant 构建文件作为 “构建器” 添加到我们的项目即可,这个构建文件中定义了构建过程的所有复杂性。这样做之后,魔术将开始上演。

为什么使用 Ant 作为项目构建器

假设我们有一个 Ant 构建文件,它从项目中的类文件创建了一个 jar 文件,然后我们把这个 jar 文件放置在项目的根目录中。(构建文件的确切内容现在还不用管。)我们想要在每次修改了 Java 文件时这个构建文件都会运行,所以 jar 文件总是保持最新。完成以下步骤:

  1. 右击 Package Explorer 视图中的项目并单击 Properties
  2. 展开 Builders 并单击 New,向项目添加一个新的构建器。
  3. 在出现的窗口中,选择 Ant Build 并单击 OK
  4. 出现构建器的 Properties 窗口(见图 18)。在该窗口中配置构建器。
    图 18. 构建器配置窗口
    构建器配置窗口
    构建器配置窗口
  5. Name 框中,键入 MyBuilder
  6. 单击 Buildfile 下的 Browse Workspace 并从项目选择构建文件。
  7. 单击 Base Directory 下的 Browse Workspace 并选择包含该构建文件的项目。为构建文件提供参数,但是因为我们现在还不需要提供,所以将它保留为空。
  8. 单击 Refresh 选项卡(见图 19)。
    刷新项目让 Eclipse Workbench 查看诸如 Ant 之类的外部工具在本地文件系统中对项目所作的更改。所以这里,告诉 Eclipse 是否在构建脚本完成后执行刷新,如果执行的话,应该刷新工作区的哪些部分。
    图 19. Refresh 选项卡
    Refresh 选项卡
    Refresh 选项卡
  9. 选中 Refresh resources upon completion 复选框。这会启用该选项卡上这个复选框下的选项。告诉 Eclipse 刷新多少工作区。选择满足工作区的最小的实体,以快速地继续运行。对于本例来说,我们只需要刷新当前项目,所以选择 The project containing the selected resource 选项。
  10. 单击 Targets 选项卡。
    图 20. Targets 选项卡
    Targets 选项卡
    Targets 选项卡

    在这里,我们选择构建文件何时真正运行,更具体来说,运行哪个目标。有四个选项:
    • After a "Clean" —— 每当我们在项目上执行一个清除操作时,目标就会运行。
    • Manual Build —— 在自动构建被关闭的时候使用该选项。每当我们执行手动构建时,指定的目标就将运行。
    • Auto-Build —— 每当执行自动构建时,目标就会运行。一般来说,就是每当我们保存 Java 文件时。
    • During a "Clean" —— 该选项与 After a "Clean" 选项不同,因为目标是在清除操作本身期间被调用。使用该选项在清除操作期间执行一些定制的文件清除。
  11. 设置目标,准备运行。每个目标选项的旁边都有一个 Set Targets 按钮,使用该按钮可以在每个操作期间设置目标准备运行。一般来说,这里选择默认的目标,但是我们可以选择任何目标,甚至可以按其运行的顺序选择多个目标。
  12. 为我们想要构建文件运行的任何操作定义将要运行的目标。
    在本例中,因为我们想要 jar 文件总是保持最新,所以为 After a "Clean" 或 Auto Build 操作设置目标。为此,单击 Set Targets,然后选择将执行的目标。如果看到为任何操作(比如 Manual Build)定义的目标,则单击 Set Targets 并清除这些目标的复选框,以禁止构建文件在这些操作期间运行。

    另外还要注意,尽管本例中我们选择在每个 Auto Build 操作之后运行目标,但是通常我们应该小心使用该选项,因为如果构建过程要花很长时间的话,Workbench 会慢到停下来。一般来说,只设置 Manual Build 和 After a "Clean" 选项。
  13. 单击 OK

现在应该测试我们新添加的构建器了。打开项目中的任何 Java 文件,做一些修改(本例中插入了一个空格)并保存。Auto Build 将会运行,我们将会在控制台中看到构建文件正在运行选中的目标。jar 文件构建好了,并出现在 Navigator 或 Package Explorer 视图中。所有这个过程每次都是自动发生的。

结束语

您已经看到,Eclipse 提供一个强大的环境,用于编写、调试和导航 Ant 构建脚本。它甚至允许您使用 Ant 作为项目构建器,所以 Ant 文件可以在后台自动执行。现在您可以在 Eclipse 中尝试构建脚本了。

我建议您通过编写一个 Ant 构建脚本并将它用作项目构建器,来自己探索本文描述的特性。此外,不要忘了手头拥有一本 Ant 参考手册,在编写自己的构建脚本时随手翻看所有可用任务的描述。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Java technology
ArticleID=150142
ArticleTitle=在 Eclipse 中轻松使用 Ant
publish-date=07262006