系列:Oracle ADF 开发必读 — 第 4 部分


使用 Ant 构建项目

在 Oracle JDeveloper 环境之外使用 Apache Ant 构建 Oracle 应用开发框架项目的技巧。

作者:John Stegeman

2010 年 2 月发布

下载:

尽管 Oracle JDeveloper 11g 使得在 IDE 中编译应用程序、生成部署构件(如 Java 存档 (JAR)、Web 应用程序存档 (WAR) 以及企业应用程序存档 (EAR))和部署应用程序变得非常容易,但如果您希望在 Oracle JDeveloper IDE 之外执行这些任务,情况又会怎样呢?例如,您使用的是持续构建工具,或者您需要在一个未安装 Oracle JDeveloper 的计算机上构建 EAR 文件。您可以手工编写脚本来完成这些任务,但这会十分繁琐。这种情况下,您可以选择使用类似 Ant 这样的构建工具。

Ant 是一个基于 Java 的构建工具,已经成为构建 Java 项目的事实标准。您也许听说过另一个流行的构建工具 Maven,它与 Ant 的区别在于,它实施统一的项目结构并提供编译和构建应用程序的方法。大多数现代 Java IDE(包括 Oracle JDeveloper)都支持 Ant 构建文件的开发,也都支持在 IDE 内部运行这些文件;而 Ant 也可以独立于任何 IDE 运行,这使得它非常适用于上面提到的情况。

在 Oracle JDeveloper IDE 中使用 Ant 既简单又直观,因为您可以访问项目的所有设置。但是,本文中,我们将解决在 Oracle JDeveloper IDE 之外运行 Ant 的问题。我将解释 Ant 的概念,同时介绍如何建立在未安装 Oracle JDeveloper 的计算机上构建 Oracle 应用开发框架 (Oracle ADF) 应用程序所需的 Ant 构建脚本。

Ant 的有关概念

构建文件。 Ant 构建文件(在概念上等同于 Make 实用程序的生成文件)是 XML 文件,描述了构建特定 目标 所需的 任务 及目标之间的依赖性。尽管通常将 Ant 构建文件命名为 build.xml,但您不一定非要遵守这一命名规则。

目标。 目标是 Ant 构建文件的基本构建块,类似于生成文件目标。常用/惯用的目标包括:

  • clean — 删除临时目录、类文件、JAR 文件和其他生成的构件
  • init — 设置构建文件的所有初始属性(按照惯例,构建文件中的大部分其他目标将取决于 init 目标。)
  • prepare — 创建其他目标所需的任何临时/输出目录(此类目录的一个示例是 .java 源代码文件编译到的 classes 目录)
  • compile — 编译应用程序的 .java 源代码文件
  • deploy — 将应用程序部署到应用服务器(通常,应用服务器供应商提供的自定义 Ant 任务支持该目标。)
  • jar/war/ear — 创建 JAR/WAR/EAR 文件

任务。 Ant 任务是构建目标时必须遵循的一系列步骤。Ant 有 100 多个内置任务,如调用 Java 编译器、创建 JAR 文件和调用 Javadoc 工具。另外,由于 Ant 是基于 Java 的,因此您可以编写自己的 Ant 任务并将它作为构建目标的一部分进行调用。

依赖性。 Ant 依赖性是一种以声明方式控制目标构建顺序的机制。例如,必须先将应用程序源代码编译为 .class 文件,然后才能构建 JAR 文件。在本示例中,假设 Ant 构建文件包括 compilejar 目标,我们可以说 jar 依赖于 compile。这样,当您让 Ant 构建 jar 目标时,Ant 将自动保证首先构建 compile 目标。实际上,Ant 足够智能,它知道磁盘上的 .class 文件是否是最新的,仅在需要时执行实际的“compile”任务。

您可以阅读在线手册、受好评的书籍 Ant in Action 以及可在互联网上搜索到的许多在线教程,来了解有关 Ant 的更多信息。

有关 ojdeploy 的说明

Oracle JDeveloper 11g 包括一个新命令行工具 ojdeploy,该工具可以通过引用应用程序 (jws) 和
项目 (jpr) 文件中的信息来编译和创建 JAR/WAR/EAR 文件;ojdeploy 还具有一个对应的 Ant 任务,因此您可以使用与 Ant 相同的功能。然而,ojdeploy(命令行工具和 Ant 任务均如此)的不足之处在于它需要在您进行构建的计算机上安装 Oracle JDeveloper。另外,在撰写本文时,发现 ojdeploy 的 Ant 任务中似乎有一个错误,该错误使 ojdeploy 无法正确创建应用程序 EAR 文件。为了避开这两点不足,本文将向您介绍在不使用 ojdeploy 的情况下如何使用 Ant 构建应用程序。

使用 Ant 构建 Oracle ADF 项目的概述

在本文中,使用本系列文章前面几部分中使用过的示例项目。您的目标是创建一组 Ant 构建脚本,可以用这些脚本从 Subversion 中签出应用程序的一个副本,并且在只安装了 Java 开发工具包 (JDK) 和 Ant 软件的“干净的”计算机上(未安装 Oracle JDeveloper 或 Oracle WebLogic Server)构建该应用程序。能够在干净的计算机上构建应用程序将使您可以使用本系列文章后续部分所介绍的其他技术,如使用持续集成服务器。

按照以下步骤创建构建脚本:

  • 创建一个 Oracle JDeveloper 项目,用来存放通常由 Oracle JDeveloper 提供的 Oracle ADF 库和其他库。只有执行了这个步骤,在“干净的”计算机上才能使用所需的库。
  • 创建一个包含所有需要的库的库定义的 Ant 脚本。
  • 确定组成所需库的 JAR 文件并将它们从 Oracle JDeveloper 安装目录复制到新项目的目录中。
  • 创建一个用于编译 Model 项目的 Ant 构建脚本。
  • 创建一个用于编译 ViewController 项目的 Ant 构建脚本。
  • 创建一个用于创建 WAR/EAR 文件的 Ant 构建脚本。

本文的其余部分将向您介绍如何完成上述每个步骤。

安装 JDevLibsForAnt 扩展

本文中的示例使用一个 Oracle JDeveloper 扩展来帮助管理 Ant 构建脚本中的 Oracle ADF 库。安装 JDevLibsForAnt:

  1. 在 Oracle JDeveloper Help 菜单中,选择 Check for Updates

    图 1

    图 1 检查更新

  2. 浏览 Welcome 页面(如果显示),然后单击 Next

    图 2

    图 2 Check for Updates 向导的 Welcome 页面

  3. 确保至少选中 Open Source and Partners 选项:

    图 3

    图 3 选择要搜索的更新中心

    选择 JDevLibsForAnt 扩展,然后单击 Next

    图 4

    图 4 选择 JDevLibsForAnt 扩展

  4. 单击 Check for Updates 的 Summary 页面中的 Finish

    图 5

    图 5 Check for Updates 的 Summary 页面

    现在,项目在 Application Navigator 中可见(尽管将它展开时还看不到有文件):

  5. 当提示您完成扩展的安装时,重启 Oracle JDeveloper。当询问您是否从以前的版本迁移用户设置时,回答 No

为 Oracle JDeveloper 库创建一个项目

为了在未安装 Oracle JDeveloper IDE 时可以编译 Oracle ADF 应用程序,Java 编译器需要访问应用程序使用的 Oracle ADF 库和其他需要的库。可以使用诸如 MavenIvy 之类的工具来帮助自动管理库依赖性;不过,当库定义中包含一个公有/私有信息库时,这些工具最有效。截至撰写本文时,没有针对 Oracle ADF 库的公有 Maven 信息库。

我使用“ADF 必读”系列文章的 第三部分中用于管理第三方库中概要介绍的方法来确保这些库对应用程序是可用的。如果您对应用程序进行设置,使其包括一个含有 Oracle JDeveloper 库的 JAR 文件的项目,您将能够在未安装 Oracle JDeveloper 的计算机上构建该应用程序。

如果您一直跟随本系列文章中的项目示例,您将有一个包含三个项目的应用程序,如下所示。

图 6

图 6 目前包含三个项目的应用程序

第一步是创建一个新项目来存放 Oracle JDeveloper 库。为此,转到 Application Navigator 的快捷菜单,选择 New Project

图 7

图 7 创建新项目

出现提示时,选择 Generic Project 类型。

图 8

图 8 选择 Generic Project

最后,为项目指定一个描述性的名称,如 JDeveloperLibs。您不需要为该项目选择任何技术,因为该项目只是所需库以及您将在下一步中创建的相关联的 Ant 脚本的占位符:

图 9

图 9 为新项目命名

现在,您的新应用程序应该如下面的屏幕截图所示:

图 10

图 10 包含新 JDeveloperLibs 项目的应用程序

如果您对项目使用了版本控制,现在应该是添加新项目的最佳时机(这里未给出该步骤)。

设置 JDeveloperLibs 项目的库引用

下一步是对新项目进行设置使其引用应用程序所需的全部库。为此,您需要确定应用程序中所有项目引用的全部库。首先,我们来找出 Model 项目使用的库。为此,双击 Model 项目以显示该项目的属性,然后在属性窗口中选择 Libraries and Classpath 类别。

图 11

图 11 Model 项目的库

记下该项目引用的所有库(该示例中有 11 个)。然后取消 Project Properties 对话框,再双击 JDeveloperLibs 项目以显示它的属性。最后,单击 Add Library 按钮,添加您在 Model 项目中记下的所有库。虽然库的顺序没有关系,但您会发现如果对它们排序会更加方便。接下来,对 ViewController 项目重复同样的过程,从 ViewController 项目向 JDeveloperLibs 项目添加所有其他库引用。注意,来自 Model 项目的库与来自 ViewController 项目的库可能会有重叠;无需将某个库添加两次。添加完库引用后,您的 JDeveloperLibs 项目所引用库的列表应如下所示(同样,库的顺序也无关紧要):

图 12

图 12 JDeveloperLibs 项目的库的完整列表

创建 jdev-libs.xml Ant 脚本

下一步是创建一个 Ant 脚本,它包含应用程序所引用的全部库的库定义。为此,您将需要使用之前安装的 JDevLibsForAnt 扩展。首先需要配置该扩展;为此,双击 JDeveloperLibs 项目以显示 Project Properties 对话框,然后选择 JDevLibsForAnt 类别。接着指定文件名 jdev-libs.xml 作为输出文件的位置,然后单击 OK

图 13

图 13 配置 JDevLibsForAnt

现在,您可以使用 JDevLibsForAnt 扩展来创建一个文件(该文件名为 jdev-libs.xml),它包含到所有 Oracle JDeveloper 库的路径引用。为此,右键单击 JDeveloperLibs 项目并选择 merge JDevLibsForAnt

图 14

图 14 运行 merge JDevLibsForAnt

运行 merge JDevLibsForAnt 后,在 Application Navigator 中单击 Refresh 按钮,查看是否创建了 jdev-libs.xml 文件。

图 15

图 15 层次结构中的 jdev-libs.xml 文件

最后,通过如下所示的全局查找替换来删除 jdev-libs.xml 中对 JDeveloper 主目录的引用:

图 16

图 16 ADF 模型运行时库定义

这将确保路径引用指向 JDeveloperLibs 项目目录,而非 JDeveloper 安装目录。

将 Oracle JDeveloper 库复制到 JDeveloperLibs 项目目录

如果您希望能够编译和构建您的 Oracle ADF 应用程序,在编译时相应的库必须是可用的。您在 Oracle JDeveloper 中构建应用程序时,没有任何问题,因为 Oracle JDeveloper 安装目录中提供了库的 JAR 文件。为了支持在未安装 Oracle JDeveloper 的计算机上进行编译,您需要以另一种方式提供 JAR 文件。通过将 JAR 文件复制到 JDeveloperLibs 项目目录并将它们添加到版本控制中,即可实现上述目的。这样,任何签出应用程序副本的人也将同时获得所需的 JAR 文件。

首次复制库文件时可能非常麻烦,但一旦完成了一次复制后,将无需再执行此操作。如果您升级了 Oracle JDeveloper 或安装了补丁,则只需刷新 JAR 文件。如果您向应用程序项目添加了其他的库,则需要添加新库。

要复制库的 JAR 文件,您将需要使用 jdev-libs.xml 文件作为引用。您需要从 JDeveloper 主目录复制 JAR 文件,并且要保持相同的目录结构。例如,我们来使用 ADF 模型运行时库:

图 17

图 17 包含来自子文件夹的内容

要复制该库的 JAR 文件,您需要在 JDeveloperLibs 项目目录中创建同样的目录结构,然后从 JDeveloper 安装目录中复制引用的 JAR 文件。需要注意的一点是,某些提供的 JDeveloper 库定义引用了不存在的文件!JDevLibsForAnt 扩展会帮助在生成的脚本中标记这些文件;在本示例中,有五个“丢失的”JAR 文件您无需复制。

例如,我们来看一下作为 ADF 模型运行时库定义一部分的第一个 JAR 文件 identitystore.jar。您会在 <JDEVELOPER 安装目录>/jdeveloper/modules/oracle.idm_11.1 目录中找到该文件。您应该在 JDeveloperLibs 项目目录中创建 jdeveloper/modules/oracle.idm_11.1.1 目录结构,并将 identitystore.jar 复制到其中。您还应该对 JDeveloperLibs 项目的 Resources 文件夹进行配置,使其显示您复制的 JAR 文件。为此,双击 JDeveloperLibs 项目以显示 Project Properties 对话框。接下来,展开 Project Source Paths 节点并选择 Resources 子节点。然后,选中 Include Contents from Subfolders 复选框:

图 18

图 18 排除 classes 文件夹

最后,在 Excluded 选项卡上,单击 Add 按钮;在 Add Exclude Filters 对话框中,选择 classes 文件夹并单击 OK

图 19

图 19 Application Navigator 中显示的 identitystore.jar 文件

现在,您应该可以在 Application Navigator 的相应目录结构中看到 identitystore.jar 文件了:

图 20

图 20 将 Ant 添加到 Model 项目的技术范围中

现在,您可以将 jdev-libs.xml 文件中引用的所有 JAR 文件复制到 JDeveloperLibs 目录中(记得要创建正确的子目录结构)。另外不要忘记将新文件添加到您的版本控制系统中!

创建 Mode 项目的 Ant 构建文件

下一步是为 Model 项目创建一个 Ant 构建文件。为此,您可以使用 Oracle JDeveloper 创建一个默认的构建文件,然后对这个默认文件进行修改以适应您的需要。要创建默认的构建文件,首先要确保 Model 项目在其技术列表中包含 Ant。为此,双击 Model 项目以显示项目属性,选择 Technology Scope 类别,将 Ant 移到所选技术列表中,然后单击 OK

图 21

图 21 创建默认的 Ant 构建文件

现在,您可以通过右键单击 Model 项目再选择 New 来创建默认的 Ant 构建文件了。 接下来,在 New Gallery 中,从 General 类别中选择 Ant,再选择 Buildfile from Project,然后单击 OK

图 22

图 22 为 Model 项目创建构建文件

Create Buildfile from Project 对话框中,保留选中所有默认选项,然后单击 OK

图 23

图 23 构建文件选项

完成这些步骤后,您将在 Model 项目的 Resources 类别中看到两个文件。 build.xml 文件包括 Ant 目标和库定义,而 build.properties 文件包含构建脚本使用的一些属性。现在,您需要对属性和构建文件稍作修改就可支持在干净的计算机上进行构建了。首先要修改 build.properties 文件。您可以从该文件注释掉(删除)两个属性。第一个是 oracle.home 属性,它指的是 JDeveloper 安装目录。因为您已经将库引用设置为独立于 JDeveloper 主目录,因此您可以从 build.properties 文件中删除这行。类似地,build.compiler 属性指示 Ant 应使用 Oracle Java 编译器编译 Java 文件。您也可以从文件中删除这行,因为干净的计算机上不会安装 Oracle Java 编译器。删除了这两个不需要的属性后,您的 build.properties 文件应如下所示:

图 24

图 24 修改后的 build.properties 文件

现在,您可以修改 build.xml 脚本了,用您在 JDeveloperLibs 项目中创建的引用替换硬编码的对 JDeveloper 安装目录的库引用。为此,打开 Model 项目的 build.xml 文件。您应该看到一组 <path> 定义(准确的说,其中的 11 个),对应于您项目引用的 11 个库。例如,ADF 模型运行时路径如下所示:

图 25

图 25 ADF 模型运行时 <path> 元素

您应删除所有这些路径定义,因为它们均指向 JDeveloper 安装目录(务必保留“classpath”路径引用)。删除了与库对应的 <path> 元素后,您的 build.xml 文件的开头应如下所示:

图 26

图 26 删除了 <path> 元素后的 build.xml 的开头

现在,您可以向该文件添加一个 <import> 元素以导入之前创建的 jdev-libs.xml 文件。在 classpath <path> 元素前面添加 <import> 元素,如下所示:

图 27

图 27 导入 jdev-libs.xml

调用 Ant 目标时,<import> 元素将 jdev-libs.xml 文件放入 build.xml 脚本中。最后,您也许已经注意到 jdev-libs.xml 中使用的 <path> ID 与 build.xml 中预期的 <path> ID 略有不同。例如,在 build.xml 中,ADF 模型运行时的 <path> ID 为 library.ADF.Model.Runtime,而在 jdev-libs.xml 中,该库的 <path> ID 为 JDeveloperLibs.library.ADF.Model.Runtime。要消除这些差别,编辑 build.xml 中的所有 refid 使之在开头处包含 JDeveloperLibs.,如下所示:

图 28

图 28 修改 build.xml 中的 path ID

这就是对文件要进行的所有修改。现在,我们来看看 build.xml 中的目标。如果您打开 build.xml 并查看 Structure 窗口,您看到的应如下所示:

图 29

图 29 build.xml 文件的结构

在这个结构中,您可以看到 initallcleancompilecopy 这五个目标,其中 all 目标是默认目标。如果您愿意,您可以彻底查看 build.xml 脚本来了解每个目标的作用。下面是每个目标的概要描述:

  • init — 创建用于存放编译后的类的输出目录(名为“classes”)
  • clean — 删除输出目录及其中的所有文件
  • compile — 编译任何 Java 源代码(注意,我们的简单 Model 项目没有任何 Java 文件!)
  • copy — 将全部其他文件(配置文件、属性文件等)复制到输出目录中的正确位置
  • all — 执行 compilecopy 目标
  • 使用离线数据库对象存储您的对象定义。当对象定义更改后,您可以使用 Oracle JDeveloper 根据数据库协调新的对象定义。
  • 使用 DDL 脚本存储您的对象定义。数据库模式相对稳定后,您可以开始创建用来在切换版本时修改数据库对象的“alter”脚本。

您还将看到某些目标依赖于其他目标;例如,Ant 执行 compile 目标时,存放编译过的 Java 类的输出(目标)目录必须存在;因此, compile 目标依赖于 init 目标。

为了避免向一个应用程序中构建多个项目时出现命名冲突,最好的方法是对所有目标重命名,将项目名称作为目标名称的前缀。例如, Model 项目不是使用 compile 目标,而是应该使用 model.compile 目标。为此,编辑 build.xml 文件,将所有目标名称修改为以“model.”开头。还要修改 depends 部分中所有目标的名称。另外,由于 classpath 是路径的通用名称,因此将 <path> id 从 classpath 修改为 model.classpath(有两个地方需要修改:<path> id 自身和 <javac> 元素的 classpathref 元素)。

现在,您还可以在 Oracle JDeveloper 中测试 Ant 目标。通过运行 all 目标进行这一测试。为此,右键单击 build.xml 文件,从 Run Ant Target 子菜单中选择 model.all 目标:

图 30

图 30 运行 model.all Ant 目标

通过查看 Apache Ant - Log 窗口,可以验证该目标是否成功执行:

图 31

图 31 Apache Ant - Log 窗口

创建 ViewController 项目的 Ant 构建文件

现在,您可以使用类似的过程创建和修改 ViewController 项目的 Ant 构建脚本。执行与 Model 项目同样的步骤:

  1. 将 Ant 添加到项目的技术范围。
  2. 创建该项目的构建文件。
  3. build.properties 文件中删除 oracle.home 和 build.compiler。
  4. 从 JDeveloper 库中删除 <path> 定义。
  5. 添加 <import> 元素以便导入 jdev-libs.xml
  6. 对 <path> ID 重命名,使其与 jdev-libs.xml 中使用的 ID 相匹配。
  7. 修改目标名称,使其以“viewcontroller”为前缀。
  8. 将 classpath ID 修改为 viewcontroller.classpath。

要完成 ViewController 项目的 build.xml 文件还需要几个步骤。第一步是删除与 JDeveloper 库对应的所有 pathelement 项。您将在文件的顶级 <path id="viewcontroller.classpath"> 元素下找到这些项。不要删除 <pathelement location="../Model/classes"/> 项,因为它对应于 Model 项目的 classes。执行完该步骤后,viewcontroller.classpath 路径应如下所示:

图 32

图 32 更新后的 viewcontroller.classpath 路径

下一步是向构建文件添加依赖性,这样可以在编译 ViewController 项目之前先编译 Model 项目(如果它不是最新的)。为此,修改 viewcontroller.compile Ant 目标中的 depends 元素,使之依赖于 model.compile 目标。因为 model.compile 目标是在 Model 项目的 build.xml 文件中定义的,因此您也需要在 ViewController 项目的 build.xml 文件中包括该文件。要包括 Model 项目的 build.xml 文件,向 ViewController 的 build.xml 文件添加“import”指令,如下所示:

图 33

图 33 导入 Model 项目的 build.xml 文件

然后,修改 viewcontroller.compile 目标使之依赖于 model.compile 目标,如下所示:

图 34

图 34 向 viewcontroller.compile 目标添加依赖性

如果您此时运行 Ant viewcontroller.compile 目标,您将看到 Ant 有些混乱,没有编译您认为应该编译的文件。问题出在所使用的路径上;因为您是从位于 ViewController 项目目录中的 build.xml 文件运行该目标的,所有路径都是相对于该目录的。为了使 Ant 能够使用这个多项目设置,最后一步是修改所有目录引用,使它们正常工作。所有路径引用都将需要“向上跳”一个目录,然后再“向下跳回”该项目目录。例如,无论您是在 Model 目录还是在 ViewController 目录,始终可以通过使用路径引用 ../Model 来引用 Model 目录,使用 ../UserInterface 来引用 UserInterface 目录。

要修改所有目录引用,您需要编辑 ModelViewController 两个项目的 build.propertiesbuild.xml 文件。我们先编辑 Model 项目的这些文件。首先,在 build.properties 文件中,将 output.dir 变量的名称更改为 model.output.dir(为了避免与 ViewController 项目的 output.dir 发生名称冲突),并将路径引用更改为如下所示:

图 35

图 35 model.output.dir

接下来,添加一个名为 model.src.dir 的变量,如下所示:

图 36

图 36 model.src.dir

ViewController 项目的 build.properties 文件执行同样的操作,使其如下所示:

图 37

图 37 ViewController 项目的 build.properties

现在,您需要更改 build.xml 文件,使所有路径引用正确并且引用 build.properties 中定义的变量。每个文件中有六项需要更改(下面的示例显示了对 Model 项目的 build.xml 文件的更改 — 您应该对 ViewController 项目也进行类似的更改):

  1. 属性文件路径(使用了上面所述的相对引用):

    图 38

  2. model.init 目标的 mkdir 元素(更改了变量名):

    图 39

  3. model.clean 目标的 fileset 元素(更改了变量名):

    图 40

  4. 在 model.compile 目标中,更改 javac 元素的 destdir 属性(更改了变量名):

    图 41

  5. 在 model.compile 目标中,更改 src 元素的 path 属性(使用新定义的 model.src.dir 变量):

    图 42

  6. 在 model.copy 目标中,更改 copy 和 fileset 元素(更改变量名并使用为 src 新定义的变量):

    图 43

对 Model 和 ViewController 的构建文件进行了上述更改后,您应该能成功运行 viewcontroller.compile 目标并会看到以下输出:

图 44

图 38 成功运行 viewcontroller.compile 后的 Ant 输出

添加 WAR 目标

现在,您能够编译整个应用程序了,您可以创建其他 Ant 目标来为应用程序创建部署构件(WAR 和 EAR 文件)。因为 Ant 已经包括了构建这些文件的任务,因此添加这些目标是相当容易的。我发现正确创建 Ant 目标的最简单的方法是,使用 Oracle JDeveloper 创建相应的文件(WAR 或 EAR),然后再解压缩该文件使其具有合适的结构。这样做,可以确保创建的文件具有正确的结构。例如,您可以右键单击 ViewController 项目,然后使用上下文菜单创建 WAR 文件:

图 45

图 39 创建 WAR 文件

如果您接着使用任何解压缩实用程序展开 WAR 文件,将发现该文件包括:

  • ViewController 的 public_html 目录的内容(不包括 WEB-INF)
  • WEB-INF 目录包括
    • 一些配置文件( adfc-config.xmlfaces-config.xmltrinidad-config.xmlweb.xmlweblogic.xml
    • 一个包含一些 ADF 库的 lib 子目录
    • 一个包含来自 ModelViewController 两个项目的所有类的 classes 子目录,该子目录中还包括 ADF 业务组件 XML 文件
    • 一个 META-INF 目录(也包含在 classes 子目录中),它包含 adfm.xml 文件

有了这些知识,您就可以在 build.xml 文件中创建相应的目标了。为了遵循目前为止我们一直使用的模式,我们在 ViewController 项目的 build.properties 文件中再创建三个用于 Ant 脚本中的属性:

图 46

图 40 再添加三个属性

接下来,更新 viewcontroller.initviewcontroller.clean 目标,分别创建这个新目录和删除该新目录:

图 47

图 41 更新后的 viewcontroller.init 和 viewcontroller.clean 目标

接下来,您可能注意到了 viewcontroller.copy 目标没有复制页面定义和相关的 ADF 模型配置文件。可以按如下所示来更改 viewcontroller.copy 目标以修复这个问题:

图 48

图 42 更新后的 viewcontroller.copy 目标

最后一个准备步骤是创建三个 Ant“patternset”引用,用于复制属于 WAR 文件的 public_html 目录及相应的 ADF 库:

图 49

图 43 用于 WAR 文件的其他 patternset

完成了前面的初始工作后,就可以创建如下的 viewcontroller.war 目标了:

图 50

图 44 viewcontroller.war 目标

在 Oracle JDeveloper 中运行 viewcontroller.war 目标应生成相应的 WAR 文件。尽管本文不介绍创建 EAR 目标的步骤,但是您可以应用同样的方法轻松创建 EAR 目标。

从命令行构建应用程序

您已经有了可用于构建应用程序的 build.xml 文件,现在可以从 Oracle JDeveloper 之外运行该构建文件了。因为您已经添加了编译该项目所需的所有 ADF 库,因此应该能够在未安装 Oracle JDeveloper 的计算机上将应用程序从 Subversion 中签出并对它进行构建(您已经在该计算机上安装了 Apache Ant 和合适的 JDK)。在下面的示例中,计算机上安装了 Ant 和 JDK,并且已经将环境变量 Ant_HOME 和 JAVA_HOME 设置为指向这些安装:

图 51

图 45 安装了 JDK 和 Ant

现在,您可以从命令行运行 Ant 来构建 WAR 文件,如下所示:

图 52

图 46 在命令提示符处构建 WAR 文件

总结

现在,您已经了解了如何创建一组构建 ADF 项目的构建脚本,可以在 Oracle JDeveloper 中运行这些脚本,也可以在只安装了 JDK 和 Ant 的独立的“干净的”计算机上运行。您也可以查看 Ant 文档来为您构建的脚本添加更多的目标和步骤。

您可能还希望阅读 Oracle 有关 WebLogic Scripting Tool (wslt) 的文档,wslt 是帮助您自动实现 WebLogic 服务器部署的工具(作为 WebLogic Ant 任务的替代工具)。

转至第 5 部分 | 返回目录

 


John Stegeman ( http://stegemanoracle.wordpress.com) 是 Cambridge Solutions(一家跨国 BPO 和 IT 服务公司)的 EMEA 地区的 Oracle ACE 总监(Oracle 融合中间件)兼首席架构师。他从 1990 年开始就使用 Oracle 产品工作,从版本 3 开始就使用 Oracle JDeveloper 了。