Oracle ADF 开发必读:第 1 部分


借助 Subversion 进行版本控制:在单用户项目中创建信息库


了解如何在单用户或是团队工作环境下使用开源版本控制系统 Subversion 管理您的 Oracle JDeveloper 11g 项目。
在本文中,将学习如何在单用户环境下创建信息库并开始使用 Subversion 进行版本控制。

作者:John Stegeman 

2008 年 12 月发布

下载

您是否曾经在制作文档(例如学校的学期论文)时,为了能回到之前版本保存了许多份副本?可能您在编程项目中也做了同样的事情,保存多份您修改过的源代码副本,以便出错时可回到之前稳定的版本。如果您做过这样的事情,您实际上已经使用了版本控制的初级形式。

然而,面对非常琐碎的项目时,您很快就会觉得这个简单的办法已不适合。当您在团队环境下工作时,您还会发现这种初级方法在使版本更改在团队成员间共享以及进行实时跟踪上的不足。

开发项目使用正式的版本控制系统作为最佳实践已经很长时间了。版本控制系统对团队、对个人都有很多优势:

  • 可以实时跟踪构件(源代码文件、文档、图像以及类似构件)的不同修订版;而且,可以轻松检索到构件的旧版本。
  • 在团队环境中,由版本化构件形成的信息库可供整个团队使用。
  • 每次修订都会生成相应信息(元数据和注释),对修订进行批注。

甚至对于简单的单一开发人员项目,使用标准的版本控制系统的优势也非常明显。本文向您介绍了如何在 Oracle JDeveloper 11g 中使用非常流行的版本控制系统 (Subversion)。

为什么使用 Subversion?

现在市面上有很多款版本控制系统,有免费的,也有付费使用的。您可能听说过其中的一些,如 CVS、git、Microsoft Visual Source Safe、Perforce、Rational ClearCase 以及 Serena Dimensions 等等。在所有可选产品中,您为什么要选择 Subversion?以下列出了一些我为我的基于 Oracle 应用开发框架 (Oracle ADF) 的项目选择 Subversion 的原因:

  • 它是免费的。我以前的一个同事常说:“免费的,我可不敢用”,但是 Subversion 却是一款非常好用的免费软件。
  • 它被广泛接受并公认为行业领先的解决方案。一项最近的 Forrester 研究报告显示 Subversion 是这一领域的唯一领跑者。
  • Oracle JDeveloper 11g 支持该软件。虽然您可以通过使用系统的本地客户端进行交互在 Oracle JDeveloper 中使用任何一款版本控制系统,但拥有与 IDE 集成的经验将会让事情变得简单些。
  • Subversion 中的所有提交都是不可分割的。当您“提交”或“签入”您对 Subversion 信息库的更改时,您的所有更改将全部成功提交,或者全部都未提交。这在 Oracle ADF 项目中尤为重要,在此类项目中,一个逻辑对象(例如 Oracle ADF 业务组件)可能由多个物理文件组成。如果提交不是不可分割的(例如,在 CVS 中),网络连接中的故障可能会导致某个逻辑对象只有部分文件得到更新,而剩下的文件则变为一组不可用的代码。
  • 它支持目录和文件的版本化。对目录的添加、删除和移动的跟踪和对单一文件的此类操作是相同的。
  • 它支持为文本文件和二进制文件进行基于差别的跟踪。大多数版本控制系统对文本文件只存储不同修订版中的差异;而 Subversion 对二进制文件也做同样的处理,这意味着减少了信息库对磁盘空间的需求。

Subversion 概念

由于不同的版本控制系统使用不同的术语,有时候还会有不同的修订版管理方法,因此让我们来了解一些主要的 Subversion 概念:

信息库位于 Subversion 中心位置,用于存储文件及其修订版。一些版本控制系统(如 git)使用分散式信息库,而 Subversion 却使用集中式的方法。
工作副本是信息库中部分或全部文件的本地副本,从信息库复制到用户的本地设备以供修改。从信息库获取工作副本的流程叫做“签出”。

Subversion 使用复制-修改-合并范例来处理团队环境下的更改。一些其他的版本控制系统使用锁定-修改-解锁范例,因此,用户必须先锁定要修改的文件并在完成修改后解锁。虽然 Subversion 也支持这种方法,但通常只用于二进制(非文本)文件。通过 Subversion, 多个用户可以同时对同一文件进行修改;这种情况下,多个更改将被合并(自动或手动)。

一本制作精良、详细解释了这些概念的免费电子书现已提供下载。

安装软件并设置信息库

您需要首先设置信息库并提供对它的访问,然后才能使用 Subversion 存储应用程序修订。Subversion 提供三种主要的信息库访问方式:

  • 通过本地文件系统(文件:协议)
  • 通过专用的 svn:网络协议
  • 通过配置有相应模块(mod_dav 和 mod_dav_svn)的 Apache HTTP 服务器

尽管 Oracle JDeveloper 提供对创建本地信息库并(通过文件:协议)访问它们的支持,但此方法只有在您是项目的唯一开发人员时才很有用。最常用的访问 Subversion 信息库的方法是通过 HTTP/HTTPS 协议(使用 Apache)。要创建信息库并通过 Apache 提供访问,您必须安装并配置一些软件 连接到一个已有 Subversion 信息库。对于我的一些 Oracle ADF 项目,我使用了提供 Web 界面来创建和管理信息库的商业 Subversion 托管服务;这可能是一个非常方便的选择,因为托管公司将会为您管理备份并且还会经常提供与问题跟踪软件的集成。

如果您希望创建您自己的信息库,您将需要安装并配置 Subversion 软件,以及 Apache 和所需模块。许多 Linux 发布版本带有已配置的 Subversion 和 Apache。针对 Microsoft Windows,一个名叫 VisualSVN 的公司创建了一个用于安装 Subversion 软件的 Windows 安装程序、一个预配置的 Apache HTTP 服务器,以及一个易于使用的管理控制台。当然,您可以单独安装 Subversion 和 Apache HTTP 服务器并使用命令行信息库管理工具来创建信息库,但使用 VisualSVN Server (www.visualsvn.com/server) 是一种更快捷的方法。

VisualSVN Server 的安装非常简单;只需下载安装程序并运行。我提供了该安装中重要部分的屏幕截图,包括指定信息库的存储路径,Apache HTTP 服务器的端口以及 Subversion 服务器应该在哪里获取其用户和组的信息。我指定了一些适用于独立安装的选件,使用 HTTP(不是 HTTPS),并且选择管理我自己的用户和组而不是使用 Windows 用户和组:

图 1

安装很快完成,并且会创建一个名为 Visual SVN Server 的 Windows 服务。在安装结束时,您将会看到启动 VisualSVN Server Manager 的选项:

图 2

在 VisualSVN Server Manager 中,您将会看到 RepositoriesUsersGroups 节点。在本文中,只需右键单击 Repositories 节点并在上下文菜单中选择 Create New Repository... 即可创建一个名为 otn 的信息库:

图 3

在 Create New Repository 对话框中,只需填写信息库的名称并选中创建默认信息库结构的复选框(稍后将介绍有关该选项的更多信息):

图 4

这就是创建您的第一个 Subversion 信息库的全部操作!如果您在 VisualSVN Server Manager 中扩展 otn 信息库,您将会看到三个目录:“trunk”、“branches”和“tags”。此三文件夹顶层结构是构建 Subversion 信息库的惯用方法。虽然您也可以使用其他任何您喜欢的顶层结构,但 trunk-branches-tags 结构是最常用的,而且我也建议您使用这种结构。每一个目录的用途如下:

  • trunk — 主线开发将在这里进行,实际上,有人更愿意视它为“主线”。
  • tags — 识别应用程序发布生命周期中的重点包括对特定的代码修订进行标记(稍后将对此进行详细介绍)。按照惯例,已标记的修订存储在 tags 目录中。
  • branches — 在繁琐的开发项目中,有些时候,源代码由于很多原因(例如开发新特性而不影响 trunk 或稳定代码以便发布)需要进行“分支”处理。按照惯例,分支创建在 branches 目录中。

为表明 Subversion 如何处理多用户,我还针对本文创建了两个用户,右键单击 VisualSVN Server Manager 中的 Users 节点并选择 Create User...。我的两个用户名为 john 和 josephine。

图 5

图 6

图 7

将您的应用程序添加到信息库中(导入)

既然您已经拥有一个 Subversion 信息库,您可以将接受版本控制的应用程序放入新信息库中(该过程称为导入)。Oracle JDeveloper 提供的 GUI 界面让该任务变得非常简单。在本文中,我使用包含两个标准项目(Oracle ADF 业务组件模型和适用于 UI 的 ViewController)的简单 Oracle ADF Fusion Web 应用程序;如果您希望按照我的方法进行操作,您可以在本文结尾的“资源”链接部分下载该应用程序。

要让应用程序接受版本控制,应确保在 Oracle JDeveloper 中选择了该应用程序;然后在 Oracle JDeveloper 的 Versioning 菜单中选择 Version Application...

图 8

出现提示时,选择 Subversion 作为信息库的类型:

图 9

如果您还没有定义任何 Subversion 连接,Oracle JDeveloper 将提示您创建一个 Subversion 连接。如果您已经定义一个或多个 Subversion 连接,您将需要从信息库连接列表中选择连接。本文中,我还没有定义任何连接,所以 Oracle JDeveloper 提示我创建一个。要创建 Subversion 连接,您需要知道信息库的 URL。要使用 VisualSVN Server Manager 获得 URL,只需右键单击信息库并在上下文菜单中选择 Copy URL to Clipboard

图 10

然后,您可以将 URL 粘贴到 JDeveloper 对话框中。在提供用户名和口令后,您可以单击 Test Read Access 以确保一切设置正确:

图 11

导入您应用程序的下一步是指定承载您应用程序的信息库的目录。根据我们之前关于 Subversion 信息库常规结构的讨论,trunk 目录是开发主线所在的目录,所以这也是我们导入的应用程序的目标位置:

图 12

下一步是指定您本地磁盘上的应用程序源目录;Oracle JDeveloper 通常会正确获取此信息,您不需要做出更改。在您对 Subversion 信息库执行操作时,为您的操作提供注释是一个很好的习惯;应用程序的初始导入也不例外,所以我们提供了一个有帮助的注释:

图 13

导入的下一步是告诉 Subversion 我们希望它忽略的文件和目录。我们通常不希望生成的文件(例如类文件)、临时文件等存储在 Subversion 信息库中,所以我们需要告诉 Subversion 忽略它们。关于机制我们不需要了解太多,只需知道 Subversion 使用一个特殊的属性来识别应该忽略的对象就够了。Oracle JDeveloper 提供了一整套默认忽略模式,然而您也可以使用 Filters 对话框自己添加:

图 14

当您将您的应用程序导入 Subversion 时,您本地磁盘上的原始文件仍然是一组本地文件;本地副本根本不具有到信息库的连接(它仅仅是一个本地副本而不是一个 Subversion“工作副本”)。通常导入您应用程序后的下一步是删除您的本地副本并签出信息库中的工作副本。Oracle JDeveloper 在下一个对话框 Options 中会向您提供一个快捷选项:

图 15

现在您可以查看导入选项汇总并完成导入:

图 16

您可以在 Oracle JDeveloper 的 SVN Console Log 窗口中查看导入流程的进度。导入完成后,您应该可以看见签出操作的进度(如果您选中了在导入后自动执行签出的复选框)。签出完成后,请查看 Application Navigator(您可能需要先单击刷新图标)。您现在应该可以看见更多的信息,如下所示:

图 17

  • 每个项目都显示了生成工作副本的信息库(此屏幕截图中为 jstegema-lap.cisgi.com)。
  • 每个文件在左下方都有一个“state overlay”图标,用来显示工作副本文件的状态。在此例中,所有的图标为圆圈,表示这些文件在签出后还没有经过本地修改。
  • 每个文件都显示了它的版本号(此屏幕截图中为 2)。文件版本号为 2(而不是 1)是因为信息库创建为版本 1 而应用程序导入为版本 2。

进行本地更改并向 Subversion 提交

现在应用程序的本地副本是一个 Subversion“工作副本”,这意味着该副本与 Subversion 信息库相关联。Subversion 通过使用工作副本中名为 .svn 的隐藏目录维护此关联,如下所示:

图 18

您不应更改 .svn 目录中的内容,因为它们由 Subversion 自动维护。

既然我们的应用程序已经接受版本控制了,那么让我们来对应用程序做些更改并将它们保存到 Subversion 信息库中。我们对 Model 项目中的 Regions 实体对象 (EO) 做一个简单的修改,设置它的更新批处理的调优属性。

图 19

在做出修改并保存 EO 后,您将注意到 Oracle JDeveloper 中发生了一些变化。首先, Regions E0 的 state overlay 图标变为星号,这说明我们做了本地更改但还没有保存(或“提交”)到 Subversion 信息库:

图 20

其次,如果您查看 Subversion Pending Changes 窗口:

图 21

您将会看到您修改过的 Regions.xml 文件被列为传出更改:

图 22

Pending Changes 窗口中,可以很方便地查看您当前程序中已在工作副本中进行更改的文件(传出)、在工作副本中新创建的但没有添加到 Subversion 的文件(待处理项)以及其他人在 Subversion 信息库中做的但没有应用到工作副本的更改(传入)。现在来说,因为我是应用程序的唯一开发人员,所以没有传入更改而只有一个传出更改。

接下来,我将完成我的更改设置,为项目中的 EmployeesJobs EO 设置相同的调优属性。当我完成时,state overlay 图标和 Pending Changes 窗口将反映出我还有三个文件中的本地修改未提交:

图 23

图 24

现在我已更改完毕,可以将它们提交给信息库了。我将使用 Application Navigator 的快捷菜单来提交我工作副本中的所有更改:

图 25

当我选择 Commit Working Copy... 后,Oracle JDeveloper 提示我输入注释。我们知道,我们应该始终提供有帮助的注释,以便项目团队一眼就可以看到已做的更改:

图 26

在更改提交后, SVN Console - Log 将显示操作结果:

图 27

state overlay 图标也变回了实心圆圈以表示没有未提交的本地修改。我提交的文件的版本号相应地增加,显示文件目前为版本 3:

图 28

Pending Changes 窗口显示无传出更改(我们已经提交了所有本地更改):

图 29

总结

您现在已经掌握了在单一用户环境下结合使用 Subversion 和 Oracle JDeveloper 11g 的相关信息。本系列的下一篇文章将介绍当有其他开发人员加入并同时作出更改的时候,您应该如何处理。

转至第 2 部分 | 返回目录

 

更多精彩内容


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