版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Oracle ADF 开发必读:第 1 部分借助 Subversion 进行版本控制:在单用户项目中创建信息库了解如何在单用户或是团队工作环境下使用开源版本控制系统 Subversion 管理您的 Oracle JDeveloper 11g项目。在本文中,将学习如何在单用户环境下创建信息库并开始使用 Subversion 进行版本控制。作者:John Stegeman您是否曾经在制作文档(例如学校的学期论文)时,为了能回到之前版本保存了许多份副本?可能您在编程项目中也做了同样的事情,保存多份您修改过的源代码副本,以便出错时可回到之前稳定的版本。如果您做过这样的事情,您实际上已经使用了版本控制的
2、初级形式。然而,面对非常琐碎的项目时,您很快就会觉得这个简单的办法已不适合。当您在团队环境下工作时,您还会发现这种初级方法在使版本更改在团队成员间共享以及进行实时跟踪上的不足。开发项目使用正式的版本控制系统作为最佳实践已经很长时间了。版本控制系统对团队、对个人都有很多优势:可以实时跟踪构件(源代码文件、文档、图像以及类似构件)的不同修订版;而且,可以轻松检索到构件的旧版本。在团队环境中,由版本化构件形成的信息库可供整个团队使用。每次修订都会生成相应信息(元数据和注释),对修订进行批注。甚至对于简单的单一开发人员项目,使用标准的版本控制系统的优势也非常明显。本文向您介绍了如何在 Oracle J
3、Developer 11g中使用非常流行的版本控制系统 (Subversion)。为什么使用 Subversion?现在市面上有很多款版本控制系统,有免费的,也有付费使用的。您可能听说过其中的一些,如 CVS、git、Microsoft Visual Source Safe、Perforce、Rational ClearCase 以及 Serena Dimensions 等等。在所有可选产品中,您为什么要选择 Subversion?以下列出了一些我为我的基于 Oracle 应用开发框架 (Oracle ADF) 的项目选择 Subversion 的原因:它是免费的。我以前的一个同事常说:“免费
4、的,我可不敢用”,但是 Subversion 却是一款非常好用的免费软件。它被广泛接受并公认为行业领先的解决方案。一项最近的 Forrester 研究报告显示 Subversion 是这一领域的唯一领跑者。Oracle JDeveloper 11g支持该软件。虽然您可以通过使用系统的本地客户端进行交互在 Oracle JDeveloper 中使用任何一款版本控制系统,但拥有与 IDE 集成的经验将会让事情变得简单些。Subversion 中的所有提交都是不可分割的。当您“提交”或“签入”您对 Subversion 信息库的更改时,您的所有更改将全部成功提交,或者全部都未提交。这在 Oracle
5、 ADF 项目中尤为重要,在此类项目中,一个逻辑对象(例如 Oracle ADF 业务组件)可能由多个物理文件组成。如果提交不是不可分割的(例如,在 CVS 中),网络连接中的故障可能会导致某个逻辑对象只有部分文件得到更新,而剩下的文件则变为一组不可用的代码。它支持目录和文件的版本化。对目录的添加、删除和移动的跟踪和对单一文件的此类操作是相同的。它支持为文本文件和二进制文件进行基于差别的跟踪。大多数版本控制系统对文本文件只存储不同修订版中的差异;而 Subversion 对二进制文件也做同样的处理,这意味着减少了信息库对磁盘空间的需求。Subversion 概念由于不同的版本控制系统使用不同的
6、术语,有时候还会有不同的修订版管理方法,因此让我们来了解一些主要的 Subversion 概念:信息库位于 Subversion 中心位置,用于存储文件及其修订版。一些版本控制系统(如 git)使用分散式信息库,而 Subversion 却使用集中式的方法。工作副本是信息库中部分或全部文件的本地副本,从信息库复制到用户的本地设备以供修改。从信息库获取工作副本的流程叫做“签出”。Subversion 使用复制-修改-合并范例来处理团队环境下的更改。一些其他的版本控制系统使用锁定-修改-解锁范例,因此,用户必须先锁定要修改的文件并在完成修改后解锁。虽然 Subversion 也支持这种方法,但通常
7、只用于二进制(非文本)文件。通过 Subversion, 多个用户可以同时对同一文件进行修改;这种情况下,多个更改将被合并(自动或手动)。一本制作精良、详细解释了这些概念的免费电子书现已提供下载。安装软件并设置信息库您需要首先设置信息库并提供对它的访问,然后才能使用 Subversion 存储应用程序修订。Subversion 提供三种主要的信息库访问方式:通过本地文件系统(文件:协议)通过专用的 svn:网络协议通过配置有相应模块(mod_dav 和 mod_dav_svn)的 Apache HTTP 服务器尽管 Oracle JDeveloper 提供对创建本地信息库并(通过文件:协议)访
8、问它们的支持,但此方法只有在您是项目的唯一开发人员时才很有用。最常用的访问 Subversion 信息库的方法是通过 HTTP/HTTPS 协议(使用 Apache)。要创建信息库并通过 Apache 提供访问,您必须安装并配置一些软件或连接到一个已有 Subversion 信息库。对于我的一些 Oracle ADF 项目,我使用了提供 Web 界面来创建和管理信息库的商业 Subversion 托管服务;这可能是一个非常方便的选择,因为托管公司将会为您管理备份并且还会经常提供与问题跟踪软件的集成。如果您希望创建您自己的信息库,您将需要安装并配置 Subversion 软件,以及 Apache
9、 和所需模块。许多 Linux 发布版本带有已配置的 Subversion 和 Apache。针对 Microsoft Windows,一个名叫 VisualSVN 的公司创建了一个用于安装 Subversion 软件的 Windows 安装程序、一个预配置的 Apache HTTP 服务器,以及一个易于使用的管理控制台。当然,您可以单独安装 Subversion 和 Apache HTTP 服务器并使用命令行信息库管理工具来创建信息库,但使用 VisualSVN Server (/server) 是一种更快捷的方法。VisualSVN Server 的安装非常简单;只需下载安装程序并运行。我
10、提供了该安装中重要部分的屏幕截图,包括指定信息库的存储路径,Apache HTTP 服务器的端口以及 Subversion 服务器应该在哪里获取其用户和组的信息。我指定了一些适用于独立安装的选件,使用 HTTP(不是 HTTPS),并且选择管理我自己的用户和组而不是使用 Windows 用户和组:安装很快完成,并且会创建一个名为 Visual SVN Server 的 Windows 服务。在安装结束时,您将会看到启动 VisualSVN Server Manager 的选项:在 VisualSVN Server Manager 中,您将会看到Repositories、Users和Groups
11、节点。在本文中,只需右键单击Repositories节点并在上下文菜单中选择Create New Repository.即可创建一个名为 otn 的信息库:在 Create New Repository 对话框中,只需填写信息库的名称并选中创建默认信息库结构的复选框(稍后将介绍有关该选项的更多信息):这就是创建您的第一个 Subversion 信息库的全部操作!如果您在 VisualSVN Server Manager 中扩展 otn 信息库,您将会看到三个目录:“trunk”、“branches”和“tags”。此三文件夹顶层结构是构建 Subversion 信息库的惯用方法。虽然您也可以使
12、用其他任何您喜欢的顶层结构,但 trunk-branches-tags 结构是最常用的,而且我也建议您使用这种结构。每一个目录的用途如下:trunk 主线开发将在这里进行,实际上,有人更愿意视它为“主线”。tags 识别应用程序发布生命周期中的重点包括对特定的代码修订进行标记(稍后将对此进行详细介绍)。按照惯例,已标记的修订存储在 tags 目录中。branches 在繁琐的开发项目中,有些时候,源代码由于很多原因(例如开发新特性而不影响 trunk 或稳定代码以便发布)需要进行“分支”处理。按照惯例,分支创建在 branches 目录中。为表明 Subversion 如何处理多用户,我还针对
13、本文创建了两个用户,右键单击 VisualSVN Server Manager 中的Users节点并选择Create User.。我的两个用户名为 john 和 josephine。将您的应用程序添加到信息库中(导入)既然您已经拥有一个 Subversion 信息库,您可以将接受版本控制的应用程序放入新信息库中(该过程称为导入)。Oracle JDeveloper 提供的 GUI 界面让该任务变得非常简单。在本文中,我使用包含两个标准项目(Oracle ADF 业务组件模型和适用于 UI 的 ViewController)的简单 Oracle ADF Fusion Web 应用程序;如果您希望
14、按照我的方法进行操作,您可以在本文结尾的“资源”链接部分下载该应用程序。要让应用程序接受版本控制,应确保在 Oracle JDeveloper 中选择了该应用程序;然后在 Oracle JDeveloper 的Versioning菜单中选择Version Application.:出现提示时,选择Subversion作为信息库的类型:如果您还没有定义任何 Subversion 连接,Oracle JDeveloper 将提示您创建一个 Subversion 连接。如果您已经定义一个或多个 Subversion 连接,您将需要从信息库连接列表中选择连接。本文中,我还没有定义任何连接,所以 Ora
15、cle JDeveloper 提示我创建一个。要创建 Subversion 连接,您需要知道信息库的 URL。要使用 VisualSVN Server Manager 获得 URL,只需右键单击信息库并在上下文菜单中选择Copy URL to Clipboard:然后,您可以将 URL 粘贴到 JDeveloper 对话框中。在提供用户名和口令后,您可以单击Test Read Access以确保一切设置正确:导入您应用程序的下一步是指定承载您应用程序的信息库的目录。根据我们之前关于 Subversion 信息库常规结构的讨论,trunk 目录是开发主线所在的目录,所以这也是我们导入的应用程序的
16、目标位置:下一步是指定您本地磁盘上的应用程序源目录;Oracle JDeveloper 通常会正确获取此信息,您不需要做出更改。在您对 Subversion 信息库执行操作时,为您的操作提供注释是一个很好的习惯;应用程序的初始导入也不例外,所以我们提供了一个有帮助的注释:导入的下一步是告诉 Subversion 我们希望它忽略的文件和目录。我们通常不希望生成的文件(例如类文件)、临时文件等存储在 Subversion 信息库中,所以我们需要告诉 Subversion 忽略它们。关于机制我们不需要了解太多,只需知道 Subversion 使用一个特殊的属性来识别应该忽略的对象就够了。Oracle
17、 JDeveloper 提供了一整套默认忽略模式,然而您也可以使用 Filters 对话框自己添加:当您将您的应用程序导入 Subversion 时,您本地磁盘上的原始文件仍然是一组本地文件;本地副本根本不具有到信息库的连接(它仅仅是一个本地副本而不是一个 Subversion“工作副本”)。通常导入您应用程序后的下一步是删除您的本地副本并签出信息库中的工作副本。Oracle JDeveloper 在下一个对话框 Options 中会向您提供一个快捷选项:现在您可以查看导入选项汇总并完成导入:您可以在 Oracle JDeveloper 的 SVN Console Log 窗口中查看导入流程的
18、进度。导入完成后,您应该可以看见签出操作的进度(如果您选中了在导入后自动执行签出的复选框)。签出完成后,请查看 Application Navigator(您可能需要先单击刷新图标)。您现在应该可以看见更多的信息,如下所示:每个项目都显示了生成工作副本的信息库(此屏幕截图中为 )。每个文件在左下方都有一个“state overlay”图标,用来显示工作副本文件的状态。在此例中,所有的图标为圆圈,表示这些文件在签出后还没有经过本地修改。每个文件都显示了它的版本号(此屏幕截图中为 2)。文件版本号为 2(而不是 1)是因为信息库创建为版本 1 而应用程序导入为版本 2。进行本地更改并向 Subve
19、rsion 提交现在应用程序的本地副本是一个 Subversion“工作副本”,这意味着该副本与 Subversion 信息库相关联。Subversion 通过使用工作副本中名为 .svn 的隐藏目录维护此关联,如下所示:您不应更改 .svn 目录中的内容,因为它们由 Subversion 自动维护。既然我们的应用程序已经接受版本控制了,那么让我们来对应用程序做些更改并将它们保存到 Subversion 信息库中。我们对 Model 项目中的Regions实体对象 (EO) 做一个简单的修改,设置它的更新批处理的调优属性。在做出修改并保存 EO 后,您将注意到 Oracle JDevelope
20、r 中发生了一些变化。首先,RegionsE0 的 state overlay 图标变为星号,这说明我们做了本地更改但还没有保存(或“提交”)到 Subversion 信息库:其次,如果您查看 SubversionPending Changes窗口:您将会看到您修改过的 Regions.xml 文件被列为传出更改:在Pending Changes窗口中,可以很方便地查看您当前程序中已在工作副本中进行更改的文件(传出)、在工作副本中新创建的但没有添加到 Subversion 的文件(待处理项)以及其他人在 Subversion 信息库中做的但没有应用到工作副本的更改(传入)。现在来说,因为我是应
21、用程序的唯一开发人员,所以没有传入更改而只有一个传出更改。接下来,我将完成我的更改设置,为项目中的Employees和JobsEO 设置相同的调优属性。当我完成时,state overlay 图标和Pending Changes窗口将反映出我还有三个文件中的本地修改未提交:现在我已更改完毕,可以将它们提交给信息库了。我将使用 Application Navigator 的快捷菜单来提交我工作副本中的所有更改:当我选择Commit Working Copy.后,Oracle JDeveloper 提示我输入注释。我们知道,我们应该始终提供有帮助的注释,以便项目团队一眼就可以看到已做的更改:在更改
22、提交后,SVN Console - Log将显示操作结果:state overlay 图标也变回了实心圆圈以表示没有未提交的本地修改。我提交的文件的版本号相应地增加,显示文件目前为版本 3:Pending Changes窗口显示无传出更改(我们已经提交了所有本地更改):总结您现在已经掌握了在单一用户环境下结合使用 Subversion 和 Oracle JDeveloper 11g的相关信息。本系列的下一篇文章将介绍当有其他开发人员加入并同时作出更改的时候,您应该如何处理。Oracle ADF 开发必读 : 第 2 部分借助 Subversion 进行版本控制:在团队环境下管理版本在本系列的第
23、 1 部分,您已学习了安装 Subversion 、设置信息库和使用 Oracle JDeveloper 11g执行基本操作等基础知识。在第 2 部分中,您将了解当您将另一位开发人员加入到团队中后,Oracle JDeveloper 和 Subversion 将如何工作。在团队中加入新的开发人员如果您从第 1 部分就按照教程进行操作,您一定记得我们创建了两个可以访问 Subversion 信息库的用户 john 和 josephine。到目前为止,John 一直是此应用程序唯一的开发人员;我们来看看 Josephine 如何加入到团队中并对该应用程序进行操作。Josephine 要做的第一件事
24、是从信息库签出一个应用程序的副本。记住“签出”应用程序副本只是在本地设备上放入一个应用程序的本地副本(以及一些日常管理目录)。这样,您就能知道本文中都是谁在执行操作,我将 Josephine 作为本文的主角。为签出应用程序的副本,Josephine 从 JDeveloper 的Versioning菜单中选择Check Out:图 1签出应用程序副本因为 Josephine 没有定义信息库连接,所以她填写了信息库信息、提供了她的凭证并测试了连接:图 2创建 Subversion 连接因为她希望在代码的开发主线(“trunk”)上工作,所以她选择了trunk目录并为签出副本提供了她本地硬盘驱动器上
25、的目标路径:图 3指定签出文件的位置然后,Oracle JDeveloper 从信息库中签出应用程序代码的最新版本并将其打开。Josephine 现在可以对应用程序代码进行操作了。为项目添加新文件现在,Josephine 是团队的一员,她希望将一个新的 Java 源代码文件添加到 ViewController 项目中。因为团队使用的是 Subversion,所以她不需要做任何特别的事情来创建新的 .java 文件并将其添加到她的项目中;只需像往常一样在 Oracle JDeveloper 中工作。Josephine 创建了一个新的 .java 文件并在其中创建了一些方法:图 4新 Hello.
26、java 文件当 Josephine 在Application Navigator窗口中看到新文件时,她将看到她的文件上有一个蓝色的 x 图标,这表示该文件还没有与 Subversion 信息库相关联:图 5Hello.java 显示蓝色 x 覆盖图标而且,当她查看Pending Changes窗口时(OracleJDeveloper 菜单中Versioning-Subversion-Pending Changes),她将看到她的新 Hello.java 文件在Candidates选项卡中列出,这表示她有一个文件待添加到版本控制中:图 6Pending changes 显示 Hello.jav
27、a 为待添加项目为了将新文件添加到版本控制,她选择该文件并使用Pending Changes窗口中的“add”按钮(加号 + 图标):图 7通过 Pending Changes 窗口添加待选文件或者在Application Navigator窗口中右键单击该文件并选择Add.:图 8通过 Application Navigator 上下文菜单添加待选文件两种方法的结果都一样 使用 Oracle JDeveloper 中的一项功能经常会有不止一种方法。添加文件将会对其进行标记以添加到信息库中;注意添加文件不会将更改提交到信息库中。当 Josephine 查看Pending Changes窗口中的
28、Outgoing选项卡时,她或许会感到一点惊讶,因为显示她有五个传出更改,而不是仅一个:图 9Pending Changes 窗口显示需要添加的文件和目录原因是 Subversion 不仅对目录,而且对文件也可以进行版本控制;添加一个新的 Java 文件也创建了一个目录结构。现在,Josephine 已完成更改,她已经准备好将它们提交到信息库中了;在她这么做之前,她的更改只是存储在她的本地硬盘驱动器中而不能供团队中的其他人使用。在第 1 部分,John 使用 Oracle JDeveloper 中的Commit Working Copy操作提交了他的更改;Josephine 的做法将会有一点不
29、同。她选择了Pending Changes窗口中的所有项目(一个文件和四个目录)并单击Commit按钮:图 10向信息库提交更改然后,她提供了提交消息/注释以便其他人知道她做出了什么修改:图 11为更改提供注释然后,OracleJDeveloper 会将更改发送到信息库,Subversion 将保存它们并递增修订号。从信息库更新应用程序因为 John 的工位就在 Josephine 的旁边,所以他可以和她讨论项目并得知她向项目中添加了一个新的 Java 类。他回到自己工位,在 Oracle JDeveloper 中打开他的项目副本,可在任何地方都没能找到该新文件:图 12John 的应用程序(
30、Hello.java 在哪里?)为什么 John 看不到它?因为每个开发人员(John 和 Josephine)都在对应用程序的本地副本进行操作。当另一个团队成员提交更改时,更改不会自动从信息库复制到本地工作副本;更改仅在开发人员特别要求从信息库更新他或她的工作副本时才会进行复制。通常,开发人员的最佳做法是定期在开始新工作前更新他们的工作副本。然而,如果不更新,开发人员怎么知道应用程序有更改需要更新呢?让我们回到 John 的工作会话以进行演示。当 John 查看Pending Changes窗口时,他注意到在Incoming选项卡中有新的文件:图 13Pending Changes 窗口中显
31、示传入更改通常,John 可以通过在Pending Changes窗口中选择要传入的更改并单击Update按钮来更新他的工作副本。但是,由于一些原因,在他的OracleJDeveloper 11g副本中,该按钮不可用,所以 John 使用了Application Navigator窗口中的Update Working Copy.:图 14更新工作副本在显示的对话框中,他接受了默认值并单击OK:图 15Update Working Copy 对话框在OracleJDeveloper 从信息库更新应用程序后,John 现在可以在Application Navigator窗口中看到 Josephin
32、e 新添加的文件:图 16John 的应用程序显示 Hello.java最佳实践:确定公用代码样式设置John 打开 Hello.java 查看 Josephine 都做了什么。他首先注意到代码格式的样式和他的不一样;相对于左大括号在同一行的格式,图 17Josephine 的代码样式他更喜欢左大括号在下一行的样式:图 18John 的代码样式所以他做的第一件事是使用OracleJDeveloper 中的 Reformat 命令让文件更易于阅读。然而,当他这样做之后,文件的内容就被更改了,并且产生了一个需要提交给信息库的更改。如果他提交更改,当 Josephine(她更喜欢原来的代码样式)下一
33、次更新她的工作副本时,会将代码格式重新设置为她喜欢的样式。如果他们不协商出一个公用的样式,John 和 Josephine 将永远在 Java 代码上打乒乓,无限次地重新格式化另一个人的代码。这个案例的教训是,当在团队环境下使用版本控制时,您需要预先就公用标准进行协商以避免出现这样的问题。幸运的是,OracleJDeveloper 具有一个用于指定代码样式首选项的选项:图 19在 Oracle JDeveloper 中设置代码样式首选项John 喜欢的样式是 JDeveloper Classic,而 Josephine 喜欢的样式是 Java Code Conventions。John 和 J
34、osephine 进行了短暂的讨论,同意都使用 JDeveloper Classic 设置。John 向 Subversion 提交了他对 Hello.java 更改(并提供了关于他所做更改的注释):图 20John 的更改注释Josephine 更改她的代码样式首选项,看到Pending Changes窗口中Incoming选项卡中的更改,并将更改更新到她的工作副本:图 21Josephine 将 John 的更改更新到她的工作副本解决冲突如前文所述,开发人员的工作副本只是其本地硬盘驱动器上的一个本地应用程序副本,所以才有了两个开发人员同时对一个文件进行操作的可能性。Subversion 提
35、供了处理这种情况的机制。有两个基本用例:第一个,如果一个开发人员在文件的开始部分对某些内容进行了编辑,而另一个开发人员在同一文件的结尾部分对某些内容进行了编辑,Subversion 可以合并这些更改。Subversion 通过一个简单的文本比较算法来完成合并,所以它不能确保更改是兼容的,但可以通过修改相同的行来确保更改没有彼此冲突。在另一个用例中,如果两个开发人员都编辑了同一个文件的同一行,Subversion 就不能合并这两个更改而需要用户手动去解决冲突。幸运的是,OracleJDeveloper 11g提供了一个绝妙的可视冲突解决机制。我们来看第一个用例,以 John 和 Josephin
36、e 的 Hello.java 文件为例。首先,John 对 sayHello 方法做了一个简单的更改以让它使用更随意的英语:图 22John 对 Hello.java 的“非正式英语”更改同时,Josephine 对 sayGoodbye 方法进行了修改以使它使用斯瓦希里语:图 23Josephine 对 Hello.java 的斯瓦希里语更改之后,Josephine 向 Subversion 提交了她的更改:图 24Josephine 提交她的斯瓦希里语更改现在,有趣的是 当 John 尝试提交他的更改时,他收到了以下错误消息:图 25错误信息提示 John 他的 Hello.java 副本
37、已过期Subversion 想要告诉他的是信息库的 Hello.java 版本已与他上次更新的版本不同,他必须先更新文件然后才能提交更改。所以 John 更新了他的工作副本,更新之后的 Hello.java 如下:图 26Josephine 的更改合并到 John 的工作副本中的 Hello.java注意,Subversion 已经自动将 Josephine 的更改合并到 John 的工作副本中。Subversion不能告诉我们更改合并后会不会仍有效(一个更改使用非正式英语而另一个更改使用斯瓦希里语);它们放在一起是否有效由 John 来决定。我们假设 John 认为这两个更改还不错;要记住目
38、前更改还仅在 John 的工作副本中而不在信息库中。所以 John 提交了修订后的 Hello.java,并仅对他的更改做了注释:图 27John 提交合并后的 Hello.java 文件最后,当 Josephine 更新她的工作副本时,她将得到一个包含她和 John 两个人的更改的 Hello.java 的最新版本。现在让我们看一下,当两个人对同一文件做出了更改而 Subversion 不能自动合并更改时会发生什么。Josephine 对 Hello.java 进行的编辑如下:图 28Josephine 对 Hello.java 做出了一些大的更改同时,John 对他的工作副本的编辑如下:图
39、 29John 也对 Hello.java 做出了一些大的更改这次 John 先提交了他的更改。现在,如果 Josephine 尝试提交 Hello.java,她将获得相同的提示她本地副本过期的错误消息。然而,当她尝试更新她的工作副本时,她将注意到三个问题。首先,在SVN Console - Log窗口中,她将看到一个冲突的提示:图 30提交时日志中显示的冲突其次,在Pending Changes窗口中,她的文件副本将标记为有冲突:图 31Pending Changes 窗口显示文件有冲突最后,在Structure窗口中,她将看到几个额外的 Hello.java 副本:图 32Structur
40、e 窗口显示 Hello.java 的其他版本这些文件是 Subversion 创建用来帮助解决冲突的,但是不必手动解决冲突,OracleJDeveloper 提供了一个非常好的可视合并工具,Josephine 可以通过右键单击 Hello.java 并选择Resolve Conflicts来激活该工具:图 33启动可视合并工具可视合并工具在左侧显示 Josephine 的文件版本(名为 Hello.java.mine),在右侧显示来自信息库的当前版本(名为 Hello.java.r),在中间显示合并结果:图 34可视合并工具显示 Hello.java 的三个版本有冲突的更改清晰地标为红色。为
41、了解决冲突,Josephine 只需选择每行应该在最终文件中出现的版本,并通过单击相应的绿色箭头( 或 svn -versionsvn, version 1.4.6 (r28521) compiled Dec 20 2007, 16:19:22就公用标准达成一致要确保您的团队使用 Oracle JDeveloper 和 Subversion 高效工作,您应该针对您的 ADF 项目制定一系列公用标准。(我在第 2 部分中介绍代码样式首选项时提供了一个示例。)另外,您的团队还应该统一一些其他标准,例如,数据库连接名称、Oracle ADF 业务组件配置设置等。如果您在项目开始时就制定了一系列公用标
42、准,则可避免在后期不得不将所有代码转换为统一样式的麻烦。Subversion 有一个特性叫做“钩子”,可以帮助您在将代码签入信息库时强制执行一组公用标准。钩子是用户提供的脚本,Subversion 会在特定时间运行它,例如在向信息库提交更改之前。您可以使用开源工具(如 HYPERLINK /index.html Checkstyle)轻松地编写一个预提交钩子来检查 Java 文件的代码样式,并在不符合统一代码样式时拒绝文件。还有一个适用于 Subversion 的框架叫做 HYPERLINK / SVNChecker,带有现成的 Subversion 钩子,可以在将代码提交到信息库之前,针对代
43、码调用 Checkstyle。无法代替交流对版本控制系统的常见误解是,使用版本控制系统减少了开发人员之间的交流需求。事实上,使用 Subversion 或任何其他版本控制系统并不会减少您团队成员之间进行交流的需求,并且有可能会增加交流的需求,因为您使用结构化程度更强(而不是结构化程度较低)的方法进行开发。当使用 Oracle ADF 开发应用程序时,您应该特别注意协调团队成员在模型层中的开发活动。此原则对于 ADF 业务组件尤为重要,因为其中的单逻辑对象(如视图对象)可能包含多个文件。如果两个开发人员都尝试添加或修改同一个视图对象,就很容易造成多文件构成的视图对象不同步并且变得不可用。要避免该
44、问题,您应该确保您的团队成员就他们的工作内容进行交流。跟踪外部依赖性当您在使用 Oracle ADF 开发应用程序时,您的应用程序经常需要依靠非 Oracle JDeveloper 生成的组件。一个常见的例子是第三方库的使用;另一个外部组件的常见例子是应用程序所依靠的数据库对象。如果您不将您的版本跟踪方法应用于这些外部组件,当团队中的一部分成员使用的业务组件版本与另一部分成员使用的版本不同时,则可能出现问题。要避免该问题,您应该将您的版本跟踪方法也应用于外部组件。现在,让我们来了解涉及更多常见外部组件时的情况。第三方库虽然 Apache Maven 为实现项目对特定版本的第三方库的相依性提供了
45、方法,但 Oracle JDeveloper 11g(在本文撰写时)还没有对 Maven 的内置支持。而且,不是所有人都在其项目中使用 Maven,所以我将介绍另一种方法。出于演示目的,我们假设您希望在您的示例应用程序中使用 Apache POI 库。执行此操作的方法之一是将所需的 JAR 文件下载到每个开发人员的文件系统上的某个位置,并在 Oracle JDeveloper 中创建一个指向该 JAR 文件的库定义。然而,当使用该方法时,不同开发人员的 JAR 文件版本可能不同,因此会产生问题。要避免此类问题,我使用的方法是创建一个包括所有第三方 JAR 文件的 Oracle JDevelop
46、er 项目;然后可以将此项目添加到 Subversion 信息库中,可以像管理您的应用程序源代码一样管理该项目。为了演示,让我们看看团队成员 John 如何针对 HYPERLINK /technetwork/cn/articles/adf/part3-098218-zhs.html Apache POI库使用此方法。John 做的第一件事是从 Apache POI 网站下载相应的文件。然后,他在其应用程序目录结构中为第三方库创建了一个目录:图 1为第三方库创建一个目录接下来,John 为 POI JAR 文件创建了一个子目录,并将它们从 POI 分发解压缩到该目录:图 2解压缩 POI JAR
47、 文件在 Oracle JDeveloper 中,John 为第三方 JAR 文件创建了一个新项目。他在之前创建的目录中创建该项目。他使用 Application Navigator 中的快捷菜单来完成此任务:图 3为第三方库创建一个新项目出现提示时,他选择 Generic Project 作为项目类型:图 4选择Generic ProjectJohn 然后指定了相应的项目名称,并提供了他之前创建的目录。不需要向此项目中添加任何库:图 5指定项目名称和目录现在,项目在 Application Navigator 中可见(尽管当将它展开时还看不到有文件):图 6新创建的项目为了让 POI JAR
48、 文件成为项目的一部分,John 必须将项目配置为包含项目资源的源路径中的所有子目录。为此,John 右键单击3pLibs项目并选择Project Properties:图 7显示项目的属性然后,通过展开Project Source Paths节点并选择Resources,他可以单击Include Content from Subfolders复选框以包括项目所有子目录中的 JAR 文件。图 8包括项目资源中的子目录进行完该配置后,现在,POI JAR 文件在 Application Navigator 中将可见:图 9Application Navigator 中的 POI JAR 文件最后
49、,John 通过Pending Changes窗口向 Sunbversion 信息库中添加四个新文件(一个新项目文件和三个 JAR 文件),并提交带有相应注释的更改:图 10提交新的项目和 JAR 文件John 现在可以创建一个新的包含 POI JAR 文件的库定义,并开始在项目中使用 Apache POI。下一次 Josephine 更新她的工作副本时,她也将看到新的 3oLibs 项目和 Apache POI 文件。将来,如果团队决定更新所使用的 Apache POI 的版本,他们可以下载新的版本,用新的版本替换现有的 JAR 文件,并向信息库提交更改,以确保整个团队使用同一版本。数据库对
50、象另一个外部依赖性的常见例子是您构建应用程序所使用的数据库对象(表、存储过程等)。如果您像许多开发团队一样 每个团队成员都使用其自己的开发数据库 您的团队成员的数据库很可能不同步,从而导致版本问题。为了避免此类问题发生,您应该将您需要的所有构件都存储在您的 Subversion 信息库中以保持数据库对象为最新。在 Oracle JDeveloper 中,您可以通过多种方法完成此操作,包括:使用离线数据库对象来存储您的对象定义。当对象定义更改后,您可以使用 Oracle JDeveloper 根据数据库协调新的对象定义。使用 DDL 脚本存储您的对象定义。数据库模式相对稳定后,您可以开始创建用来
51、在切换版本时修改数据库对象的“alter”脚本。无论您使用什么方法控制对象的版本,不要忘记对常用数据项目也(例如存储在数据库表中的配置数据,查找值等)要进行版本控制。 HYPERLINK /Blogs/scott/ K. Scott Allen发布了一篇很有帮助的 HYPERLINK /Blogs/scott/archive/2008/02/03/11746.aspx 五部分系列,介绍了在数据库中进行版本控制的方法,其中包含对数据库进行版本控制非常有效的方法。注意开发中的阻塞点在许多基于 Oracle ADF 的应用程序中,在向应用程序添加新组件的时候会更改一些组件。我将这些组件称为“阻塞点”
52、。使用 Oracle ADF 开发的应用程序中的两个常见阻塞点是,模型层中的应用程序模块和视图层的 faces-config.xml 文件。如果您的团队在修改这些组件时没有注意,那么很有可能两个团队成员同时修改一个文件。大多数情况下,Subversion 不能合并这样的更改,或者合并的结果为不可使用的组件(因为合并只作用于文本差异而不是语义差异)。要避免这样的阻塞点,我根据团队规模和开发进展使用下面两种方法中的一种。第一种方法是指定一个开发人员来拥有对每一个阻塞点组件的更改;当另一个开发人员需要更改组件时,他/她需要与组件所有者就所需更改进行沟通,然后由所有者进行更改并提交给信息库。此方法的优
53、点是它几乎完全消除了出现冲突和语义错误合并的可能性。主要的缺点是,该方法需要开发人员坚持执行手动流程并且将会需要额外的层来进行交流,这可能会给开发过程带来瓶颈。在实际操作中,我发现此方法在阻塞点组件的变化较频繁的开发初期阶段更加实用。第二种方法是允许所有开发人员对阻塞点组件进行更改。如果在提交时发生冲突或者在更新时发生合并,开发人员可以从信息库恢复更改之前组件的最新版本(还原他/她之前对该对象所做的所有更改)并重新将他/她的更改应用/编码到组件中。此方法避免了 Subversion 的合并操作生成一个不可用对象的可能性,但需要开发人员在发生合并/冲突时做更多的工作。在实际操作中,我发现此方法在
54、阻塞点组件更改频率较低的开发后期阶段更为实用,因为发生合并/冲突的几率也降低了。总结您已经了解了如何结合使用 Oracle JDeveloper 11g和 Subversion 信息库在具有多个开发人员和多个开发分支的团队环境中工作,并对常见的潜在问题有了一定的了解。您应该已经可以在任何 Oracle ADF 项目中使用 Subversion 了,无论是在单用户环境或是多用户团队环境下。Oracle ADF 开发必读 : 第 4 部分使用 Ant 构建项目在 Oracle JDeveloper 环境之外使用 Apache Ant 构建 Oracle 应用开发框架项目的技巧。作者:John St
55、egeman尽管 Oracle JDeveloper 11g使得在 IDE 中编译应用程序、生成部署构件(如 Java 存档 (JAR)、Web 应用程序存档 (WAR) 以及企业应用程序存档 (EAR))和部署应用程序变得非常容易,但如果您希望在 Oracle JDeveloper IDE 之外执行这些任务,情况又会怎样呢?例如,您使用的是持续构建工具,或者您需要在一个未安装 Oracle JDeveloper 的计算机上构建 EAR 文件。您可以手工编写脚本来完成这些任务,但这会十分繁琐。这种情况下,您可以选择使用类似 Ant 这样的构建工具。Ant 是一个基于 Java 的构建工具,已经
56、成为构建 Java 项目的事实标准。您也许听说过另一个流行的构建工具 Maven,它与 Ant 的区别在于,它实施统一的项目结构并提供编译和构建应用程序的方法。大多数现代 Java IDE(包括 Oracle JDeveloper)都支持 Ant 构建文件的开发,也都支持在 IDE 内部运行这些文件;而 Ant 也可以独立于任何 IDE 运行,这使得它非常适用于上面提到的情况。在 Oracle JDeveloper IDE 中使用 Ant 既简单又直观,因为您可以访问项目的所有设置。但是,本文中,我们将解决在 Oracle JDeveloper IDE 之外运行 Ant 的问题。我将解释 An
57、t 的概念,同时介绍如何建立在未安装 Oracle JDeveloper 的计算机上构建 Oracle 应用开发框架 (Oracle ADF) 应用程序所需的 Ant 构建脚本。Ant 的有关概念构建文件。Ant 构建文件(在概念上等同于 Make 实用程序的生成文件)是 XML 文件,描述了构建特定目标所需的任务及目标之间的依赖性。尽管通常将 Ant 构建文件命名为build.xml,但您不一定非要遵守这一命名规则。目标。目标是 Ant 构建文件的基本构建块,类似于生成文件目标。常用/惯用的目标包括:clean 删除临时目录、类文件、JAR 文件和其他生成的构件init 设置构建文件的所有初
58、始属性(按照惯例,构建文件中的大部分其他目标将取决于init目标。)prepare 创建其他目标所需的任何临时/输出目录(此类目录的一个示例是 .java 源代码文件编译到的 classes 目录)compile 编译应用程序的 .java 源代码文件deploy 将应用程序部署到应用服务器(通常,应用服务器供应商提供的自定义 Ant 任务支持该目标。)jar/war/ear 创建 JAR/WAR/EAR 文件任务。Ant 任务是构建目标时必须遵循的一系列步骤。Ant 有 100 多个内置任务,如调用 Java 编译器、创建 JAR 文件和调用 Javadoc 工具。另外,由于 Ant 是基于
59、 Java 的,因此您可以编写自己的 Ant 任务并将它作为构建目标的一部分进行调用。依赖性。Ant 依赖性是一种以声明方式控制目标构建顺序的机制。例如,必须先将应用程序源代码编译为 .class 文件,然后才能构建 JAR 文件。在本示例中,假设 Ant 构建文件包括compile和jar目标,我们可以说jar依赖于compile。这样,当您让 Ant 构建jar目标时,Ant 将自动保证首先构建compile目标。实际上,Ant 足够智能,它知道磁盘上的 .class 文件是否是最新的,仅在需要时执行实际的“compile”任务。您可以阅读 HYPERLINK /manual/index.
60、html 在线手册、受好评的书籍 HYPERLINK /loughran/ Ant in Action以及可在互联网上搜索到的许多在线教程,来了解有关 Ant 的更多信息。有关 ojdeploy 的说明Oracle JDeveloper 11g包括一个新命令行工具 ojdeploy,该工具可以通过引用应用程序 (jws) 和项目 (jpr) 文件中的信息来编译和创建 JAR/WAR/EAR 文件;ojdeploy 还具有一个对应的 Ant 任务,因此您可以使用与 Ant 相同的功能。然而,ojdeploy(命令行工具和 Ant 任务均如此)的不足之处在于它需要在您进行构建的计算机上安装 Ora
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年北京市通州区高三一模语文试卷(含答案)
- 电驱液压机械装置的制作课件
- 垂钓活动免责协议书
- 2024年医师培训心得体会
- 2024年数学认识数字教案
- 35kv线路继电保护与自动装置设计
- 6月8日世界海洋日活动方案
- 城市轨道交通应急处理教案26-项目八-恶劣天气与自然灾害应急处理-任务1 恶劣天气应急处理
- 简约绿色水果招商产品展示模板
- Honeywell安全仪表系统(SIS) 技术交流
- 基于复杂网络的城市轨道交通-公交网络鲁棒性分析与优化
- 2025年叉车证特种设备作业N1证理论考试试题(300题)含答案
- 酒店安全管理制度
- 【物理】物理法拉第电磁感应定律的专项培优易错试卷练习题(含答案)及详细答案
- 2025年西藏自治区中考地理试卷真题(含答案及解析)
- (2021-2025)5年高考1年模拟化学真题分类汇编专题15 有机化学基础综合题(湖南专用)
- 路桥英语面试题目及答案
- 2025年理赔专业技术职务任职资格考试(理赔员·农险理赔)历年参考题库含答案详解(5套)
- 安利业务制度讲解
- DB23∕T 3082-2022 黑龙江省城镇道路设计规程
- 甘肃省定西市市级名校2026届中考冲刺卷物理试题含解析
评论
0/150
提交评论