OracleADF开发必读:第1部分借助Subversion进行版本控制:在单用户项目中创建信息库了解如何在单用户或是团队工作环境下使用开源版本控制系统Subversion管理您的OracleJDeveloper11g项目。在本文中,将学习如何在单用户环境下创建信息库并开始使用Subversion进行版本控制。作者:JohnStegeman您是否曾经在制作文档(例如学校的学期论文)时,为了能回到之前版本保存了许多份副本?可能您在编程项目中也做了同样的事情,保存多份您修改过的源代码副本,以便出错时可回到之前稳定的版本。如果您做过这样的事情,您实际上已经使用了版本控制的初级形式。然而,面对非常琐碎的项目时,您很快就会觉得这个简单的办法已不适合。当您在团队环境下工作时,您还会发现这种初级方法在使版本更改在团队成员间共享以及进行实时跟踪上的不足。开发项目使用正式的版本控制系统作为最佳实践已经很长时间了。版本控制系统对团队、对个人都有很多优势:可以实时跟踪构件(源代码文件、文档、图像以及类似构件)的不同修订版;而且,可以轻松检索到构件的旧版本。在团队环境中,由版本化构件形成的信息库可供整个团队使用。每次修订都会生成相应信息(元数据和注释),对修订进行批注。甚至对于简单的单一开发人员项目,使用标准的版本控制系统的优势也非常明显。本文向您介绍了如何在OracleJDeveloper11g中使用非常流行的版本控制系统(Subversion)。为什么使用Subversion?现在市面上有很多款版本控制系统,有免费的,也有付费使用的。您可能听说过其中的一些,如CVS、git、MicrosoftVisualSourceSafe、Perforce、RationalClearCase以及SerenaDimensions等等。在所有可选产品中,您为什么要选择Subversion?以下列出了一些我为我的基于Oracle应用开发框架(OracleADF)的项目选择Subversion的原因:它是免费的。我以前的一个同事常说:“免费的,我可不敢用”,但是Subversion却是一款非常好用的免费软件。它被广泛接受并公认为行业领先的解决方案。一项最近的Forrester研究报告显示Subversion是这一领域的唯一领跑者。OracleJDeveloper11g支持该软件。虽然您可以通过使用系统的本地客户端进行交互在OracleJDeveloper中使用任何一款版本控制系统,但拥有与IDE集成的经验将会让事情变得简单些。Subversion中的所有提交都是不可分割的。当您“提交”或“签入”您对Subversion信息库的更改时,您的所有更改将全部成功提交,或者全部都未提交。这在OracleADF项目中尤为重要,在此类项目中,一个逻辑对象(例如OracleADF业务组件)可能由多个物理文件组成。如果提交不是不可分割的(例如,在CVS中),网络连接中的故障可能会导致某个逻辑对象只有部分文件得到更新,而剩下的文件则变为一组不可用的代码。它支持目录和文件的版本化。对目录的添加、删除和移动的跟踪和对单一文件的此类操作是相同的。它支持为文本文件和二进制文件进行基于差别的跟踪。大多数版本控制系统对文本文件只存储不同修订版中的差异;而Subversion对二进制文件也做同样的处理,这意味着减少了信息库对磁盘空间的需求。Subversion概念由于不同的版本控制系统使用不同的术语,有时候还会有不同的修订版管理方法,因此让我们来了解一些主要的Subversion概念:信息库位于Subversion中心位置,用于存储文件及其修订版。一些版本控制系统(如git)使用分散式信息库,而Subversion却使用集中式的方法。工作副本是信息库中部分或全部文件的本地副本,从信息库复制到用户的本地设备以供修改。从信息库获取工作副本的流程叫做“签出”。Subversion使用复制-修改-合并范例来处理团队环境下的更改。一些其他的版本控制系统使用锁定-修改-解锁范例,因此,用户必须先锁定要修改的文件并在完成修改后解锁。虽然Subversion也支持这种方法,但通常只用于二进制(非文本)文件。通过Subversion,多个用户可以同时对同一文件进行修改;这种情况下,多个更改将被合并(自动或手动)。一本制作精良、详细解释了这些概念的免费电子书现已提供下载。安装软件并设置信息库您需要首先设置信息库并提供对它的访问,然后才能使用Subversion存储应用程序修订。Subversion提供三种主要的信息库访问方式:通过本地文件系统(文件:协议)通过专用的svn:网络协议通过配置有相应模块(mod_dav和mod_dav_svn)的ApacheHTTP服务器尽管OracleJDeveloper提供对创建本地信息库并(通过文件:协议)访问它们的支持,但此方法只有在您是项目的唯一开发人员时才很有用。最常用的访问Subversion信息库的方法是通过HTTP/HTTPS协议(使用Apache)。要创建信息库并通过Apache提供访问,您必须安装并配置一些软件或连接到一个已有Subversion信息库。对于我的一些OracleADF项目,我使用了提供Web界面来创建和管理信息库的商业Subversion托管服务;这可能是一个非常方便的选择,因为托管公司将会为您管理备份并且还会经常提供与问题跟踪软件的集成。如果您希望创建您自己的信息库,您将需要安装并配置Subversion软件,以及Apache和所需模块。许多Linux发布版本带有已配置的Subversion和Apache。针对MicrosoftWindows,一个名叫VisualSVN的公司创建了一个用于安装Subversion软件的Windows安装程序、一个预配置的ApacheHTTP服务器,以及一个易于使用的管理控制台。当然,您可以单独安装Subversion和ApacheHTTP服务器并使用命令行信息库管理工具来创建信息库,但使用VisualSVNServer(www.visualsvn.com/server)是一种更快捷的方法。VisualSVNServer的安装非常简单;只需下载安装程序并运行。我提供了该安装中重要部分的屏幕截图,包括指定信息库的存储路径,ApacheHTTP服务器的端口以及Subversion服务器应该在哪里获取其用户和组的信息。我指定了一些适用于独立安装的选件,使用HTTP(不是HTTPS),并且选择管理我自己的用户和组而不是使用Windows用户和组:安装很快完成,并且会创建一个名为VisualSVNServer的Windows服务。在安装结束时,您将会看到启动VisualSVNServerManager的选项:在VisualSVNServerManager中,您将会看到Repositories、Users和Groups节点。在本文中,只需右键单击Repositories节点并在上下文菜单中选择CreateNewRepository...即可创建一个名为otn的信息库:在CreateNewRepository对话框中,只需填写信息库的名称并选中创建默认信息库结构的复选框(稍后将介绍有关该选项的更多信息):这就是创建您的第一个Subversion信息库的全部操作!如果您在VisualSVNServerManager中扩展otn信息库,您将会看到三个目录:“trunk”、“branches”和“tags”。此三文件夹顶层结构是构建Subversion信息库的惯用方法。虽然您也可以使用其他任何您喜欢的顶层结构,但trunk-branches-tags结构是最常用的,而且我也建议您使用这种结构。每一个目录的用途如下:trunk—主线开发将在这里进行,实际上,有人更愿意视它为“主线”。tags—识别应用程序发布生命周期中的重点包括对特定的代码修订进行标记(稍后将对此进行详细介绍)。按照惯例,已标记的修订存储在tags目录中。branches—在繁琐的开发项目中,有些时候,源代码由于很多原因(例如开发新特性而不影响trunk或稳定代码以便发布)需要进行“分支”处理。按照惯例,分支创建在branches目录中。为表明Subversion如何处理多用户,我还针对本文创建了两个用户,右键单击VisualSVNServerManager中的Users节点并选择CreateUser...。我的两个用户名为john和josephine。将您的应用程序添加到信息库中(导入)既然您已经拥有一个Subversion信息库,您可以将接受版本控制的应用程序放入新信息库中(该过程称为导入)。OracleJDeveloper提供的GUI界面让该任务变得非常简单。在本文中,我使用包含两个标准项目(OracleADF业务组件模型和适用于UI的ViewController)的简单OracleADFFusionWeb应用程序;如果您希望按照我的方法进行操作,您可以在本文结尾的“资源”链接部分下载该应用程序。要让应用程序接受版本控制,应确保在OracleJDeveloper中选择了该应用程序;然后在OracleJDeveloper的Versioning菜单中选择VersionApplication...:出现提示时,选择Subversion作为信息库的类型:如果您还没有定义任何Subversion连接,OracleJDeveloper将提示您创建一个Subversion连接。如果您已经定义一个或多个Subversion连接,您将需要从信息库连接列表中选择连接。本文中,我还没有定义任何连接,所以OracleJDeveloper提示我创建一个。要创建Subversion连接,您需要知道信息库的URL。要使用VisualSVNServerManager获得URL,只需右键单击信息库并在上下文菜单中选择CopyURLtoClipboard:然后,您可以将URL粘贴到JDeveloper对话框中。在提供用户名和口令后,您可以单击TestReadAccess以确保一切设置正确:导入您应用程序的下一步是指定承载您应用程序的信息库的目录。根据我们之前关于Subversion信息库常规结构的讨论,trunk目录是开发主线所在的目录,所以这也是我们导入的应用程序的目标位置:下一步是指定您本地磁盘上的应用程序源目录;OracleJDeveloper通常会正确获取此信息,您不需要做出更改。在您对Subversion信息库执行操作时,为您的操作提供注释是一个很好的习惯;应用程序的初始导入也不例外,所以我们提供了一个有帮助的注释:导入的下一步是告诉Subversion我们希望它忽略的文件和目录。我们通常不希望生成的文件(例如类文件)、临时文件等存储在Subversion信息库中,所以我们需要告诉Subversion忽略它们。关于机制我们不需要了解太多,只需知道Subversion使用一个特殊的属性来识别应该忽略的对象就够了。OracleJDeveloper提供了一整套默认忽略模式,然而您也可以使用Filters对话框自己添加:当您将您的应用程序导入Subversion时,您本地磁盘上的原始文件仍然是一组本地文件;本地副本根本不具有到信息库的连接(它仅仅是一个本地副本而不是一个Subversion“工作副本”)。通常导入您应用程序后的下一步是删除您的本地副本并签出信息库中的工作副本。OracleJDeveloper在下一个对话框Options中会向您提供一个快捷选项:现在您可以查看导入选项汇总并完成导入:您可以在OracleJDeveloper的SVNConsoleLog窗口中查看导入流程的进度。导入完成后,您应该可以看见签出操作的进度(如果您选中了在导入后自动执行签出的复选框)。签出完成后,请查看ApplicationNavigator(您可能需要先单击刷新图标)。您现在应该可以看见更多的信息,如下所示:每个项目都显示了生成工作副本的信息库(此屏幕截图中为j