文章
应用开发框架
了解如何在单用户或是团队工作环境下使用开源版本控制系统 Subversion 管理您的 Oracle JDeveloper 11g 项目。 在本文中,将学习如何在单用户环境下创建信息库并开始使用 Subversion 进行版本控制。
作者:John Stegeman
2008 年 12 月发布
下载
您是否曾经在制作文档(例如学校的学期论文)时,为了能回到之前版本保存了许多份副本?可能您在编程项目中也做了同样的事情,保存多份您修改过的源代码副本,以便出错时可回到之前稳定的版本。如果您做过这样的事情,您实际上已经使用了版本控制的初级形式。
然而,面对非常琐碎的项目时,您很快就会觉得这个简单的办法已不适合。当您在团队环境下工作时,您还会发现这种初级方法在使版本更改在团队成员间共享以及进行实时跟踪上的不足。
开发项目使用正式的版本控制系统作为最佳实践已经很长时间了。版本控制系统对团队、对个人都有很多优势:
甚至对于简单的单一开发人员项目,使用标准的版本控制系统的优势也非常明显。本文向您介绍了如何在 Oracle JDeveloper 11g 中使用非常流行的版本控制系统 (Subversion)。
现在市面上有很多款版本控制系统,有免费的,也有付费使用的。您可能听说过其中的一些,如 CVS、git、Microsoft Visual Source Safe、Perforce、Rational ClearCase 以及 Serena Dimensions 等等。在所有可选产品中,您为什么要选择 Subversion?以下列出了一些我为我的基于 Oracle 应用开发框架 (Oracle ADF) 的项目选择 Subversion 的原因:
由于不同的版本控制系统使用不同的术语,有时候还会有不同的修订版管理方法,因此让我们来了解一些主要的 Subversion 概念:
信息库位于 Subversion 中心位置,用于存储文件及其修订版。一些版本控制系统(如 git)使用分散式信息库,而 Subversion 却使用集中式的方法。
工作副本是信息库中部分或全部文件的本地副本,从信息库复制到用户的本地设备以供修改。从信息库获取工作副本的流程叫做“签出”。
Subversion 使用复制-修改-合并范例来处理团队环境下的更改。一些其他的版本控制系统使用锁定-修改-解锁范例,因此,用户必须先锁定要修改的文件并在完成修改后解锁。虽然 Subversion 也支持这种方法,但通常只用于二进制(非文本)文件。通过 Subversion, 多个用户可以同时对同一文件进行修改;这种情况下,多个更改将被合并(自动或手动)。
一本制作精良、详细解释了这些概念的免费电子书现已提供下载。
您需要首先设置信息库并提供对它的访问,然后才能使用 Subversion 存储应用程序修订。Subversion 提供三种主要的信息库访问方式:
尽管 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 用户和组:
安装很快完成,并且会创建一个名为 Visual SVN Server 的 Windows 服务。在安装结束时,您将会看到启动 VisualSVN Server Manager 的选项:
在 VisualSVN Server Manager 中,您将会看到 Repositories、 Users 和 Groups 节点。在本文中,只需右键单击 Repositories 节点并在上下文菜单中选择 Create New Repository... 即可创建一个名为 otn 的信息库:
在 Create New Repository 对话框中,只需填写信息库的名称并选中创建默认信息库结构的复选框(稍后将介绍有关该选项的更多信息):
这就是创建您的第一个 Subversion 信息库的全部操作!如果您在 VisualSVN Server Manager 中扩展 otn 信息库,您将会看到三个目录:“trunk”、“branches”和“tags”。此三文件夹顶层结构是构建 Subversion 信息库的惯用方法。虽然您也可以使用其他任何您喜欢的顶层结构,但 trunk-branches-tags 结构是最常用的,而且我也建议您使用这种结构。每一个目录的用途如下:
为表明 Subversion 如何处理多用户,我还针对本文创建了两个用户,右键单击 VisualSVN Server Manager 中的 Users 节点并选择 Create User...。我的两个用户名为 john 和 josephine。
既然您已经拥有一个 Subversion 信息库,您可以将接受版本控制的应用程序放入新信息库中(该过程称为导入)。Oracle JDeveloper 提供的 GUI 界面让该任务变得非常简单。在本文中,我使用包含两个标准项目(Oracle ADF 业务组件模型和适用于 UI 的 ViewController)的简单 Oracle ADF Fusion Web 应用程序;如果您希望按照我的方法进行操作,您可以在本文结尾的“资源”链接部分下载该应用程序。
要让应用程序接受版本控制,应确保在 Oracle JDeveloper 中选择了该应用程序;然后在 Oracle JDeveloper 的 Versioning 菜单中选择 Version Application...:
出现提示时,选择 Subversion 作为信息库的类型:
如果您还没有定义任何 Subversion 连接,Oracle JDeveloper 将提示您创建一个 Subversion 连接。如果您已经定义一个或多个 Subversion 连接,您将需要从信息库连接列表中选择连接。本文中,我还没有定义任何连接,所以 Oracle JDeveloper 提示我创建一个。要创建 Subversion 连接,您需要知道信息库的 URL。要使用 VisualSVN Server Manager 获得 URL,只需右键单击信息库并在上下文菜单中选择 Copy URL to Clipboard:
然后,您可以将 URL 粘贴到 JDeveloper 对话框中。在提供用户名和口令后,您可以单击 Test Read Access 以确保一切设置正确:
导入您应用程序的下一步是指定承载您应用程序的信息库的目录。根据我们之前关于 Subversion 信息库常规结构的讨论,trunk 目录是开发主线所在的目录,所以这也是我们导入的应用程序的目标位置:
下一步是指定您本地磁盘上的应用程序源目录;Oracle JDeveloper 通常会正确获取此信息,您不需要做出更改。在您对 Subversion 信息库执行操作时,为您的操作提供注释是一个很好的习惯;应用程序的初始导入也不例外,所以我们提供了一个有帮助的注释:
导入的下一步是告诉 Subversion 我们希望它忽略的文件和目录。我们通常不希望生成的文件(例如类文件)、临时文件等存储在 Subversion 信息库中,所以我们需要告诉 Subversion 忽略它们。关于机制我们不需要了解太多,只需知道 Subversion 使用一个特殊的属性来识别应该忽略的对象就够了。Oracle JDeveloper 提供了一整套默认忽略模式,然而您也可以使用 Filters 对话框自己添加:
当您将您的应用程序导入 Subversion 时,您本地磁盘上的原始文件仍然是一组本地文件;本地副本根本不具有到信息库的连接(它仅仅是一个本地副本而不是一个 Subversion“工作副本”)。通常导入您应用程序后的下一步是删除您的本地副本并签出信息库中的工作副本。Oracle JDeveloper 在下一个对话框 Options 中会向您提供一个快捷选项:
现在您可以查看导入选项汇总并完成导入:
您可以在 Oracle JDeveloper 的 SVN Console Log 窗口中查看导入流程的进度。导入完成后,您应该可以看见签出操作的进度(如果您选中了在导入后自动执行签出的复选框)。签出完成后,请查看 Application Navigator(您可能需要先单击刷新图标)。您现在应该可以看见更多的信息,如下所示:
现在应用程序的本地副本是一个 Subversion“工作副本”,这意味着该副本与 Subversion 信息库相关联。Subversion 通过使用工作副本中名为 .svn 的隐藏目录维护此关联,如下所示:
您不应更改 .svn 目录中的内容,因为它们由 Subversion 自动维护。
既然我们的应用程序已经接受版本控制了,那么让我们来对应用程序做些更改并将它们保存到 Subversion 信息库中。我们对 Model 项目中的 Regions 实体对象 (EO) 做一个简单的修改,设置它的更新批处理的调优属性。
在做出修改并保存 EO 后,您将注意到 Oracle JDeveloper 中发生了一些变化。首先, Regions E0 的 state overlay 图标变为星号,这说明我们做了本地更改但还没有保存(或“提交”)到 Subversion 信息库:
其次,如果您查看 Subversion Pending Changes 窗口:
您将会看到您修改过的 Regions.xml 文件被列为传出更改:
在 Pending Changes 窗口中,可以很方便地查看您当前程序中已在工作副本中进行更改的文件(传出)、在工作副本中新创建的但没有添加到 Subversion 的文件(待处理项)以及其他人在 Subversion 信息库中做的但没有应用到工作副本的更改(传入)。现在来说,因为我是应用程序的唯一开发人员,所以没有传入更改而只有一个传出更改。
接下来,我将完成我的更改设置,为项目中的 Employees 和 Jobs EO 设置相同的调优属性。当我完成时,state overlay 图标和 Pending Changes 窗口将反映出我还有三个文件中的本地修改未提交:
现在我已更改完毕,可以将它们提交给信息库了。我将使用 Application Navigator 的快捷菜单来提交我工作副本中的所有更改:
当我选择 Commit Working Copy... 后,Oracle JDeveloper 提示我输入注释。我们知道,我们应该始终提供有帮助的注释,以便项目团队一眼就可以看到已做的更改:
在更改提交后, SVN Console - Log 将显示操作结果:
state overlay 图标也变回了实心圆圈以表示没有未提交的本地修改。我提交的文件的版本号相应地增加,显示文件目前为版本 3:
Pending Changes 窗口显示无传出更改(我们已经提交了所有本地更改):
您现在已经掌握了在单一用户环境下结合使用 Subversion 和 Oracle JDeveloper 11g 的相关信息。本系列的下一篇文章将介绍当有其他开发人员加入并同时作出更改的时候,您应该如何处理。
转至第 2 部分 | 返回目录