ORACLEADF開發(fā)詳細(xì)介紹_第1頁
ORACLEADF開發(fā)詳細(xì)介紹_第2頁
ORACLEADF開發(fā)詳細(xì)介紹_第3頁
ORACLEADF開發(fā)詳細(xì)介紹_第4頁
ORACLEADF開發(fā)詳細(xì)介紹_第5頁
已閱讀5頁,還剩159頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

185/185OracleADF開發(fā)必讀:第1局部

借助Subversion進(jìn)行版本控制:在單用戶工程中創(chuàng)立信息庫

了解如何在單用戶或是團(tuán)隊工作環(huán)境下使用開源版本控制系統(tǒng)Subversion管理您的OracleJDeveloper11g

工程。

在本文中,將學(xué)習(xí)如何在單用戶環(huán)境下創(chuàng)立信息庫并開始使用Subversion進(jìn)行版本控制。作者:JohnStegeman

您是否曾經(jīng)在制作文檔(例如學(xué)校的學(xué)期論文)時,為了能回到之前版本保存了許多份副本?可能您在編程工程中也做了同樣的事情,保存多份您修改正的源代碼副本,以便出錯時可回到之前穩(wěn)定的版本。如果您做過這樣的事情,您實際上已經(jīng)使用了版本控制的初級形式。然而,面對非常瑣碎的工程時,您很快就會覺得這個簡單的方法已不適合。當(dāng)您在團(tuán)隊環(huán)境下工作時,您還會發(fā)現(xiàn)這種初級方法在使版本更改在團(tuán)隊成員間共享以及進(jìn)行實時跟蹤上的缺乏。開發(fā)工程使用正式的版本控制系統(tǒng)作為最正確實踐已經(jīng)很長時間了。版本控制系統(tǒng)對團(tuán)隊、對個人都有很多優(yōu)勢:可以實時跟蹤構(gòu)件(源代碼文件、文檔、圖像以及類似構(gòu)件)的不同修訂版;而且,可以輕松檢索到構(gòu)件的舊版本。在團(tuán)隊環(huán)境中,由版本化構(gòu)件形成的信息庫可供整個團(tuán)隊使用。每次修訂都會生成相應(yīng)信息(元數(shù)據(jù)和注釋),對修訂進(jìn)行批注。甚至對于簡單的單一開發(fā)人員工程,使用標(biāo)準(zhǔn)的版本控制系統(tǒng)的優(yōu)勢也非常明顯。本文向您介紹了如何在OracleJDeveloper11g

中使用非常流行的版本控制系統(tǒng)(Subversion)。為什么使用Subversion?現(xiàn)在市面上有很多款版本控制系統(tǒng),有免費的,也有付費使用的。您可能聽說過其中的一些,如CVS、git、MicrosoftVisualSourceSafe、Perforce、RationalClearCase以及SerenaDimensions等等。在所有可選產(chǎn)品中,您為什么要選擇Subversion?以以下出了一些我為我的基于Oracle應(yīng)用開發(fā)框架(OracleADF)的工程選擇Subversion的原因:它是免費的。我以前的一個同事常說:“免費的,我可不敢用〞,但是Subversion卻是一款非常好用的免費軟件。它被廣泛接受并公認(rèn)為行業(yè)領(lǐng)先的解決方案。一項最近的Forrester研究報告顯示Subversion是這一領(lǐng)域的唯一領(lǐng)跑者。OracleJDeveloper11g

支持該軟件。雖然您可以通過使用系統(tǒng)的本地客戶端進(jìn)行交互在OracleJDeveloper中使用任何一款版本控制系統(tǒng),但擁有與IDE集成的經(jīng)驗將會讓事情變得簡單些。Subversion中的所有提交都是不可分割的。當(dāng)您“提交〞或“簽入〞您對Subversion信息庫的更改時,您的所有更改將全部成功提交,或者全部都未提交。這在OracleADF工程中尤為重要,在此類工程中,一個邏輯對象(例如OracleADF業(yè)務(wù)組件)可能由多個物理文件組成。如果提交不是不可分割的(例如,在CVS中),網(wǎng)絡(luò)連接中的故障可能會導(dǎo)致某個邏輯對象只有局部文件得到更新,而剩下的文件則變?yōu)橐唤M不可用的代碼。它支持目錄和文件的版本化。對目錄的添加、刪除和移動的跟蹤和對單一文件的此類操作是相同的。它支持為文本文件和二進(jìn)制文件進(jìn)行基于差異的跟蹤。大多數(shù)版本控制系統(tǒng)對文本文件只存儲不同修訂版中的差異;而Subversion對二進(jìn)制文件也做同樣的處理,這意味著減少了信息庫對磁盤空間的需求。Subversion概念由于不同的版本控制系統(tǒng)使用不同的術(shù)語,有時候還會有不同的修訂版管理方法,因此讓我們來了解一些主要的Subversion概念:信息庫位于Subversion中心位置,用于存儲文件及其修訂版。一些版本控制系統(tǒng)(如git)使用分散式信息庫,而Subversion卻使用集中式的方法。工作副本是信息庫中局部或全部文件的本地副本,從信息庫復(fù)制到用戶的本地設(shè)備以供修改。從信息庫獲取工作副本的流程叫做“簽出〞。Subversion使用復(fù)制-修改-合并范例來處理團(tuán)隊環(huán)境下的更改。一些其他的版本控制系統(tǒng)使用鎖定-修改-解鎖范例,因此,用戶必須先鎖定要修改的文件并在完成修改后解鎖。雖然Subversion也支持這種方法,但通常只用于二進(jìn)制(非文本)文件。通過Subversion,多個用戶可以同時對同一文件進(jìn)行修改;這種情況下,多個更改將被合并(自動或手動)。一本制作精良、詳細(xì)解釋了這些概念的免費電子書現(xiàn)已提供下載。安裝軟件并設(shè)置信息庫您需要首先設(shè)置信息庫并提供對它的訪問,然后才能使用Subversion存儲應(yīng)用程序修訂。Subversion提供三種主要的信息庫訪問方式:通過本地文件系統(tǒng)(文件:協(xié)議)通過專用的svn:網(wǎng)絡(luò)協(xié)議通過配置有相應(yīng)模塊(mod_dav和mod_dav_svn)的ApacheHTTP效勞器盡管OracleJDeveloper提供對創(chuàng)立本地信息庫并(通過文件:協(xié)議)訪問它們的支持,但此方法只有在您是工程的唯一開發(fā)人員時才很有用。最常用的訪問Subversion信息庫的方法是通過HTTP/HTTPS協(xié)議(使用Apache)。要創(chuàng)立信息庫并通過Apache提供訪問,您必須安裝并配置一些軟件

連接到一個已有Subversion信息庫。對于我的一些OracleADF工程,我使用了提供Web界面來創(chuàng)立和管理信息庫的商業(yè)Subversion托管效勞;這可能是一個非常方便的選擇,因為托管公司將會為您管理備份并且還會經(jīng)常提供與問題跟蹤軟件的集成。如果您希望創(chuàng)立您自己的信息庫,您將需要安裝并配置Subversion軟件,以及Apache和所需模塊。許多Linux發(fā)布版本帶有已配置的Subversion和Apache。針對MicrosoftWindows,一個名叫VisualSVN的公司創(chuàng)立了一個用于安裝Subversion軟件的Windows安裝程序、一個預(yù)配置的ApacheHTTP效勞器,以及一個易于使用的管理控制臺。當(dāng)然,您可以單獨安裝Subversion和ApacheHTTP效勞器并使用命令行信息庫管理工具來創(chuàng)立信息庫,但使用VisualSVNServer()是一種更快捷的方法。VisualSVNServer的安裝非常簡單;只需下載安裝程序并運行。我提供了該安裝中重要局部的屏幕截圖,包括指定信息庫的存儲路徑,ApacheHTTP效勞器的端口以及Subversion效勞器應(yīng)該在哪里獲取其用戶和組的信息。我指定了一些適用于獨立安裝的選件,使用HTTP(不是HTTPS),并且選擇管理我自己的用戶和組而不是使用Windows用戶和組:安裝很快完成,并且會創(chuàng)立一個名為VisualSVNServer的Windows效勞。在安裝結(jié)束時,您將會看到啟動VisualSVNServerManager的選項:在VisualSVNServerManager中,您將會看到

Repositories、

Users

Groups

節(jié)點。在本文中,只需右鍵單擊

Repositories

節(jié)點并在上下文菜單中選擇

CreateNewRepository...

即可創(chuàng)立一個名為otn的信息庫:在CreateNewRepository對話框中,只需填寫信息庫的名稱并選中創(chuàng)立默認(rèn)信息庫結(jié)構(gòu)的復(fù)選框(稍后將介紹有關(guān)該選項的更多信息):這就是創(chuàng)立您的第一個Subversion信息庫的全部操作!如果您在VisualSVNServerManager中擴(kuò)展otn信息庫,您將會看到三個目錄:“trunk〞、“branches〞和“tags〞。此三文件夾頂層結(jié)構(gòu)是構(gòu)建Subversion信息庫的慣用方法。雖然您也可以使用其他任何您喜歡的頂層結(jié)構(gòu),但trunk-branches-tags結(jié)構(gòu)是最常用的,而且我也建議您使用這種結(jié)構(gòu)。每一個目錄的用途如下:trunk

—主線開發(fā)將在這里進(jìn)行,實際上,有人更愿意視它為“主線〞。tags

—識別應(yīng)用程序發(fā)布生命周期中的重點包括對特定的代碼修訂進(jìn)行標(biāo)記(稍后將對此進(jìn)行詳細(xì)介紹)。按照慣例,已標(biāo)記的修訂存儲在tags目錄中。branches

—在繁瑣的開發(fā)工程中,有些時候,源代碼由于很多原因(例如開發(fā)新特性而不影響trunk或穩(wěn)定代碼以便發(fā)布)需要進(jìn)行“分支〞處理。按照慣例,分支創(chuàng)立在branches目錄中。為說明Subversion如何處理多用戶,我還針對本文創(chuàng)立了兩個用戶,右鍵單擊VisualSVNServerManager中的

Users

節(jié)點并選擇

CreateUser...。我的兩個用戶名為john和josephine。將您的應(yīng)用程序添加到信息庫中(導(dǎo)入)既然您已經(jīng)擁有一個Subversion信息庫,您可以將接受版本控制的應(yīng)用程序放入新信息庫中(該過程稱為導(dǎo)入)。OracleJDeveloper提供的GUI界面讓該任務(wù)變得非常簡單。在本文中,我使用包含兩個標(biāo)準(zhǔn)工程(OracleADF業(yè)務(wù)組件模型和適用于UI的ViewController)的簡單OracleADFFusionWeb應(yīng)用程序;如果您希望按照我的方法進(jìn)行操作,您可以在本文結(jié)尾的“資源〞鏈接局部下載該應(yīng)用程序。要讓應(yīng)用程序接受版本控制,應(yīng)確保在OracleJDeveloper中選擇了該應(yīng)用程序;然后在OracleJDeveloper的

Versioning

菜單中選擇

VersionApplication...:出現(xiàn)提示時,選擇

Subversion

作為信息庫的類型:如果您還沒有定義任何Subversion連接,OracleJDeveloper將提示您創(chuàng)立一個Subversion連接。如果您已經(jīng)定義一個或多個Subversion連接,您將需要從信息庫連接列表中選擇連接。本文中,我還沒有定義任何連接,所以O(shè)racleJDeveloper提示我創(chuàng)立一個。要創(chuàng)立Subversion連接,您需要知道信息庫的URL。要使用VisualSVNServerManager獲得URL,只需右鍵單擊信息庫并在上下文菜單中選擇

CopyURLtoClipboard:然后,您可以將URL粘貼到JDeveloper對話框中。在提供用戶名和口令后,您可以單擊

TestReadAccess

以確保一切設(shè)置正確:導(dǎo)入您應(yīng)用程序的下一步是指定承載您應(yīng)用程序的信息庫的目錄。根據(jù)我們之前關(guān)于Subversion信息庫常規(guī)結(jié)構(gòu)的討論,trunk目錄是開發(fā)主線所在的目錄,所以這也是我們導(dǎo)入的應(yīng)用程序的目標(biāo)位置:下一步是指定您本地磁盤上的應(yīng)用程序源目錄;OracleJDeveloper通常會正確獲取此信息,您不需要做出更改。在您對Subversion信息庫執(zhí)行操作時,為您的操作提供注釋是一個很好的習(xí)慣;應(yīng)用程序的初始導(dǎo)入也不例外,所以我們提供了一個有幫助的注釋:導(dǎo)入的下一步是告訴Subversion我們希望它忽略的文件和目錄。我們通常不希望生成的文件(例如類文件)、臨時文件等存儲在Subversion信息庫中,所以我們需要告訴Subversion忽略它們。關(guān)于機(jī)制我們不需要了解太多,只需知道Subversion使用一個特殊的屬性來識別應(yīng)該忽略的對象就夠了。OracleJDeveloper提供了一整套默認(rèn)忽略模式,然而您也可以使用Filters對話框自己添加:當(dāng)您將您的應(yīng)用程序?qū)隨ubversion時,您本地磁盤上的原始文件仍然是一組本地文件;本地副本根本不具有到信息庫的連接(它僅僅是一個本地副本而不是一個Subversion“工作副本〞)。通常導(dǎo)入您應(yīng)用程序后的下一步是刪除您的本地副本并簽出信息庫中的工作副本。OracleJDeveloper在下一個對話框Options中會向您提供一個快捷選項:現(xiàn)在您可以查看導(dǎo)入選項匯總并完成導(dǎo)入:您可以在OracleJDeveloper的SVNConsoleLog窗口中查看導(dǎo)入流程的進(jìn)度。導(dǎo)入完成后,您應(yīng)該可以看見簽出操作的進(jìn)度(如果您選中了在導(dǎo)入后自動執(zhí)行簽出的復(fù)選框)。簽出完成后,請查看ApplicationNavigator(您可能需要先單擊刷新圖標(biāo))。您現(xiàn)在應(yīng)該可以看見更多的信息,如下所示:每個工程都顯示了生成工作副本的信息庫(此屏幕截圖中為)。每個文件在左下方都有一個“stateoverlay〞圖標(biāo),用來顯示工作副本文件的狀態(tài)。在此例中,所有的圖標(biāo)為圓圈,表示這些文件在簽出后還沒有經(jīng)過本地修改。每個文件都顯示了它的版本號(此屏幕截圖中為2)。文件版本號為2(而不是1)是因為信息庫創(chuàng)立為版本1而應(yīng)用程序?qū)霝榘姹?。進(jìn)行本地更改并向Subversion提交現(xiàn)在應(yīng)用程序的本地副本是一個Subversion“工作副本〞,這意味著該副本與Subversion信息庫相關(guān)聯(lián)。Subversion通過使用工作副本中名為.svn的隱藏目錄維護(hù)此關(guān)聯(lián),如下所示:您不應(yīng)更改.svn目錄中的內(nèi)容,因為它們由Subversion自動維護(hù)。既然我們的應(yīng)用程序已經(jīng)接受版本控制了,那么讓我們來對應(yīng)用程序做些更改并將它們保存到Subversion信息庫中。我們對Model工程中的

Regions

實體對象(EO)做一個簡單的修改,設(shè)置它的更新批處理的調(diào)優(yōu)屬性。在做出修改并保存EO后,您將注意到OracleJDeveloper中發(fā)生了一些變化。首先,

Regions

E0的stateoverlay圖標(biāo)變?yōu)樾翘枺@說明我們做了本地更改但還沒有保存(或“提交〞)到Subversion信息庫:其次,如果您查看Subversion

PendingChanges

窗口:您將會看到您修改正的Regions.xml文件被列為傳出更改:在

PendingChanges

窗口中,可以很方便地查看您當(dāng)前程序中已在工作副本中進(jìn)行更改的文件(傳出)、在工作副本中新創(chuàng)立的但沒有添加到Subversion的文件(待處理項)以及其他人在Subversion信息庫中做的但沒有應(yīng)用到工作副本的更改(傳入)。現(xiàn)在來說,因為我是應(yīng)用程序的唯一開發(fā)人員,所以沒有傳入更改而只有一個傳出更改。接下來,我將完成我的更改設(shè)置,為工程中的

Employees

Jobs

EO設(shè)置相同的調(diào)優(yōu)屬性。當(dāng)我完成時,stateoverlay圖標(biāo)和

PendingChanges

窗口將反映出我還有三個文件中的本地修改未提交:現(xiàn)在我已更改完畢,可以將它們提交給信息庫了。我將使用ApplicationNavigator的快捷菜單來提交我工作副本中的所有更改:當(dāng)我選擇

CommitWorkingCopy...

后,OracleJDeveloper提示我輸入注釋。我們知道,我們應(yīng)該始終提供有幫助的注釋,以便工程團(tuán)隊一眼就可以看到已做的更改:在更改提交后,

SVNConsole-Log

將顯示操作結(jié)果:stateoverlay圖標(biāo)也變回了實心圓圈以表示沒有未提交的本地修改。我提交的文件的版本號相應(yīng)地增加,顯示文件目前為版本3:PendingChanges

窗口顯示無傳出更改(我們已經(jīng)提交了所有本地更改):總結(jié)您現(xiàn)在已經(jīng)掌握了在單一用戶環(huán)境下結(jié)合使用Subversion和OracleJDeveloper11g

的相關(guān)信息。本系列的下一篇文章將介紹當(dāng)有其他開發(fā)人員參加并同時作出更改的時候,您應(yīng)該如何處理。OracleADF開發(fā)必讀:第2局部

借助Subversion進(jìn)行版本控制:在團(tuán)隊環(huán)境下管理版本

在本系列的第1局部,您已學(xué)習(xí)了安裝Subversion、設(shè)置信息庫和使用OracleJDeveloper11g

執(zhí)行根本操作等基礎(chǔ)知識。在第2局部中,您將了解當(dāng)您將另一位開發(fā)人員參加到團(tuán)隊中后,OracleJDeveloper和Subversion將如何工作。在團(tuán)隊中參加新的開發(fā)人員如果您從第1局部就按照教程進(jìn)行操作,您一定記得我們創(chuàng)立了兩個可以訪問Subversion信息庫的用戶john和josephine。到目前為止,John一直是此應(yīng)用程序唯一的開發(fā)人員;我們來看看Josephine如何參加到團(tuán)隊中并對該應(yīng)用程序進(jìn)行操作。Josephine要做的第一件事是從信息庫簽出一個應(yīng)用程序的副本。記住“簽出〞應(yīng)用程序副本只是在本地設(shè)備上放入一個應(yīng)用程序的本地副本(以及一些日常管理目錄)。這樣,您就能知道本文中都是誰在執(zhí)行操作,我將Josephine作為本文的主角。為簽出應(yīng)用程序的副本,Josephine從JDeveloper的

Versioning

菜單中選擇

CheckOut…:圖1

簽出應(yīng)用程序副本因為Josephine沒有定義信息庫連接,所以她填寫了信息庫信息、提供了她的憑證并測試了連接:圖2

創(chuàng)立Subversion連接因為她希望在代碼的開發(fā)主線(“trunk〞)上工作,所以她選擇了

trunk

目錄并為簽出副本提供了她本地硬盤驅(qū)動器上的目標(biāo)路徑:圖3

指定簽出文件的位置然后,OracleJDeveloper從信息庫中簽出應(yīng)用程序代碼的最新版本并將其翻開。Josephine現(xiàn)在可以對應(yīng)用程序代碼進(jìn)行操作了。為工程添加新文件現(xiàn)在,Josephine是團(tuán)隊的一員,她希望將一個新的Java源代碼文件添加到ViewController工程中。因為團(tuán)隊使用的是Subversion,所以她不需要做任何特別的事情來創(chuàng)立新的.java文件并將其添加到她的工程中;只需像往常一樣在OracleJDeveloper中工作。Josephine創(chuàng)立了一個新的.java文件并在其中創(chuàng)立了一些方法:圖4

新Hello.java文件當(dāng)Josephine在

ApplicationNavigator

窗口中看到新文件時,她將看到她的文件上有一個藍(lán)色的x圖標(biāo),這表示該文件還沒有與Subversion信息庫相關(guān)聯(lián):圖5

Hello.java顯示藍(lán)色x覆蓋圖標(biāo)而且,當(dāng)她查看

PendingChanges

窗口時(Oracle

JDeveloper菜單中

Versioning

->

Subversion

->

PendingChanges),她將看到她的新Hello.java文件在

Candidates

選項卡中列出,這表示她有一個文件待添加到版本控制中:圖6

Pendingchanges顯示Hello.java為待添加工程為了將新文件添加到版本控制,她選擇該文件并使用

PendingChanges

窗口中的“add〞按鈕(加號[+]圖標(biāo)):圖7

通過PendingChanges窗口添加待選文件或者在

ApplicationNavigator

窗口中右鍵單擊該文件并選擇

Add...:圖8

通過ApplicationNavigator上下文菜單添加待選文件兩種方法的結(jié)果都一樣—使用OracleJDeveloper中的一項功能經(jīng)常會有不止一種方法。添加文件將會對其進(jìn)行標(biāo)記以添加到信息庫中;注意添加文件不

會將更改提交到信息庫中。當(dāng)Josephine查看

PendingChanges

窗口中的

Outgoing

選項卡時,她或許會感到一點驚訝,因為顯示她有五個傳出更改,而不是僅一個:圖9

PendingChanges窗口顯示需要添加的文件和目錄原因是Subversion不僅對目錄,而且對文件也可以進(jìn)行版本控制;添加一個新的Java文件也創(chuàng)立了一個目錄結(jié)構(gòu)。現(xiàn)在,Josephine已完成更改,她已經(jīng)準(zhǔn)備好將它們提交到信息庫中了;在她這么做之前,她的更改只是存儲在她的本地硬盤驅(qū)動器中而不能供團(tuán)隊中的其他人使用。在第1局部,John使用OracleJDeveloper中的

CommitWorkingCopy…

操作提交了他的更改;Josephine的做法將會有一點不同。她選擇了

PendingChanges

窗口中的所有工程(一個文件和四個目錄)并單擊

Commit…

按鈕:圖10

向信息庫提交更改然后,她提供了提交消息/注釋以便其他人知道她做出了什么修改:圖11

為更改提供注釋然后,Oracle

JDeveloper會將更改發(fā)送到信息庫,Subversion將保存它們并遞增修訂號。從信息庫更新應(yīng)用程序因為John的工位就在Josephine的旁邊,所以他可以和她討論工程并得知她向工程中添加了一個新的Java類。他回到自己工位,在OracleJDeveloper中翻開他的工程副本,可在任何地方都沒能找到該新文件:圖12

John的應(yīng)用程序(Hello.java在哪里?)為什么John看不到它?因為每個開發(fā)人員(John和Josephine)都在對應(yīng)用程序的本地副本進(jìn)行操作。當(dāng)另一個團(tuán)隊成員提交更改時,更改不

會自動從信息庫復(fù)制到本地工作副本;更改僅在開發(fā)人員特別要求從信息庫更新

他或她的工作副本時才會進(jìn)行復(fù)制。通常,開發(fā)人員的最正確做法是定期在開始新工作前更新他們的工作副本。然而,如果不更新,開發(fā)人員怎么知道應(yīng)用程序有更改需要更新呢?讓我們回到John的工作會話以進(jìn)行演示。當(dāng)John查看

PendingChanges

窗口時,他注意到在

Incoming

選項卡中有新的文件:圖13

PendingChanges窗口中顯示傳入更改通常,John可以通過在

PendingChanges

窗口中選擇要傳入的更改并單擊

Update

按鈕來更新他的工作副本。但是,由于一些原因,在他的

Oracle

JDeveloper11g

副本中,該按鈕不可用,所以John使用了ApplicationNavigator

窗口中的

UpdateWorkingCopy...:圖14

更新工作副本在顯示的對話框中,他接受了默認(rèn)值并單擊

OK:圖15

UpdateWorkingCopy對話框在

Oracle

JDeveloper從信息庫更新應(yīng)用程序后,John現(xiàn)在可以在

ApplicationNavigator

窗口中看到Josephine新添加的文件:圖16

John的應(yīng)用程序顯示Hello.java最正確實踐:確定公用代碼樣式設(shè)置John翻開Hello.java查看Josephine都做了什么。他首先注意到代碼格式的樣式和他的不一樣;相對于左大括號在同一行的格式,圖17

Josephine的代碼樣式他更喜歡左大括號在下一行的樣式:圖18

John的代碼樣式所以他做的第一件事是使用

Oracle

JDeveloper中的Reformat命令讓文件更易于閱讀。然而,當(dāng)他這樣做之后,文件的內(nèi)容就被更改了,并且產(chǎn)生了一個需要提交給信息庫的更改。如果他提交更改,當(dāng)Josephine(她更喜歡原來的代碼樣式)下一次更新她的工作副本時,會將代碼格式重新設(shè)置為她喜歡的樣式。如果他們不協(xié)商出一個公用的樣式,John和Josephine將永遠(yuǎn)在Java代碼上打乒乓,無限次地重新格式化另一個人的代碼。這個案例的教訓(xùn)是,當(dāng)在團(tuán)隊環(huán)境下使用版本控制時,您需要預(yù)先就公用標(biāo)準(zhǔn)進(jìn)行協(xié)商以防止出現(xiàn)這樣的問題。幸運的是,Oracle

JDeveloper具有一個用于指定代碼樣式首選項的選項:圖19

在OracleJDeveloper中設(shè)置代碼樣式首選項John喜歡的樣式是JDeveloperClassic,而Josephine喜歡的樣式是JavaCodeConventions。John和Josephine進(jìn)行了短暫的討論,同意都使用JDeveloperClassic設(shè)置。John向Subversion提交了他對Hello.java更改(并提供了關(guān)于他所做更改的注釋):圖20

John的更改注釋Josephine更改她的代碼樣式首選項,看到

PendingChanges

窗口中

Incoming

選項卡中的更改,并將更改更新到她的工作副本:圖21

Josephine將John的更改更新到她的工作副本解決沖突如前文所述,開發(fā)人員的工作副本只是其本地硬盤驅(qū)動器上的一個本地應(yīng)用程序副本,所以才有了兩個開發(fā)人員同時對一個文件進(jìn)行操作的可能性。Subversion提供了處理這種情況的機(jī)制。有兩個根本用例:第一個,如果一個開發(fā)人員在文件的開始局部對某些內(nèi)容進(jìn)行了編輯,而另一個開發(fā)人員在同一文件的結(jié)尾局部對某些內(nèi)容進(jìn)行了編輯,Subversion可以合并這些更改。Subversion通過一個簡單的文本比較算法來完成合并,所以它不能確保更改是兼容的,但可以通過修改相同的行來確保更改沒有彼此沖突。在另一個用例中,如果兩個開發(fā)人員都編輯了同一個文件的同一行,Subversion就不能合并這兩個更改而需要用戶手動去解決沖突。幸運的是,Oracle

JDeveloper11g

提供了一個絕妙的可視沖突解決機(jī)制。我們來看第一個用例,以John和Josephine的Hello.java文件為例。首先,John對sayHello方法做了一個簡單的更改以讓它使用更隨意的英語:圖22

John對Hello.java的“非正式英語〞更改同時,Josephine對sayGoodbye方法進(jìn)行了修改以使它使用斯瓦希里語:圖23

Josephine對Hello.java的斯瓦希里語更改之后,Josephine向Subversion提交了她的更改:圖24

Josephine提交她的斯瓦希里語更改現(xiàn)在,有趣的是—當(dāng)John嘗試提交他的更改時,他收到了以下錯誤消息:圖25

錯誤信息提示John他的Hello.java副本已過期Subversion想要告訴他的是信息庫的Hello.java版本已與他上次更新的版本不同,他必須先更新文件然后才能提交更改。所以John更新了他的工作副本,更新之后的Hello.java如下:圖26

Josephine的更改合并到John的工作副本中的Hello.java注意,Subversion已經(jīng)自動將Josephine的更改合并到John的工作副本中。Subversion

能告訴我們更改合并后會不會仍有效(一個更改使用非正式英語而另一個更改使用斯瓦希里語);它們放在一起是否有效由John來決定。我們假設(shè)John認(rèn)為這兩個更改還不錯;要記住目前更改還僅在John的工作副本中而不在信息庫中。所以John提交了修訂后的Hello.java,并僅對他的更改做了注釋:圖27

John提交合并后的Hello.java文件最后,當(dāng)Josephine更新她的工作副本時,她將得到一個包含她和John兩個人的更改的Hello.java的最新版本。現(xiàn)在讓我們看一下,當(dāng)兩個人對同一文件做出了更改而Subversion不能自動合并更改時會發(fā)生什么。Josephine對Hello.java進(jìn)行的編輯如下:圖28

Josephine對Hello.java做出了一些大的更改同時,John對他的工作副本的編輯如下:圖29

John也對Hello.java做出了一些大的更改這次John先提交了他的更改。現(xiàn)在,如果Josephine嘗試提交Hello.java,她將獲得相同的提示她本地副本過期的錯誤消息。然而,當(dāng)她嘗試更新她的工作副本時,她將注意到三個問題。首先,在

SVNConsole-Log

窗口中,她將看到一個沖突的提示:圖30

提交時日志中顯示的沖突其次,在

PendingChanges

窗口中,她的文件副本將標(biāo)記為有沖突:圖31

PendingChanges窗口顯示文件有沖突最后,在

Structure

窗口中,她將看到幾個額外的Hello.java副本:圖32

Structure窗口顯示Hello.java的其他版本這些文件是Subversion創(chuàng)立用來幫助解決沖突的,但是不必手動解決沖突,Oracle

JDeveloper提供了一個非常好的可視合并工具,Josephine可以通過右鍵單擊Hello.java并選擇

ResolveConflicts

來激活該工具:圖33

啟動可視合并工具可視合并工具在左側(cè)顯示Josephine的文件版本(名為Hello.java.mine),在右側(cè)顯示來自信息庫的當(dāng)前版本(名為Hello.java.r<修訂號>),在中間顯示合并結(jié)果:圖34

可視合并工具顯示Hello.java的三個版本有沖突的更改清晰地標(biāo)為紅色。為了解決沖突,Josephine只需選擇每行應(yīng)該在最終文件中出現(xiàn)的版本,并通過單擊相應(yīng)的綠色箭頭(>或<)將其合并到中心窗格中。例如,我們假設(shè)Josephine選擇了她的版本的sayHello和John版本的sayGoodbye。結(jié)果如下:圖35

解決沖突后的可視合并工具現(xiàn)在所有的沖突都解決了,她可以單擊

SaveandCompleteMerge

按鈕完成操作。當(dāng)她刷新

ApplicationNavigator

窗口后,所有的沖突構(gòu)件(Hello.java的額外版本)都將刪除,她可以用正常的方式向信息庫提交她的更改。John現(xiàn)在可以更新他的工作副本,并將看到文件的新版本。Praise和Blame命令Subversion命令行程序有兩個名字很奇怪的命令praise和blame,可以用來識別最后提交對文件每一行的更改的人。praise和blame命令的作用是相同的;通常,當(dāng)您想要找出誰做了有趣或正確的更改時,可以使用praise,而當(dāng)您要找出誰引入了一個錯誤時,可以使用blame。Oracle

JDeveloper通過“批注〞可以采用可視的方式公開這一信息。要查看贊揚/批評信息,只需右鍵單擊編輯器,并在Versioning子菜單中選擇

ViewAnnotation:圖36

顯示批注Oracle

JDeveloper將在左側(cè)邊列顯示彩色條;當(dāng)您將光標(biāo)移動到它們上方時,Oracle

JDeveloper將會顯示以下信息:最后提交對該局部更改的開發(fā)人員、提交的修訂號以及提交日期:圖37

批注顯示John修改了一局部代碼添加標(biāo)記現(xiàn)在您已經(jīng)了解了如何使用Subversion的基礎(chǔ)知識,下面我們來看另一個常用活動:“添加標(biāo)記〞。添加標(biāo)記是用于在特定時間點標(biāo)注或標(biāo)記源代碼副本的過程。按照慣例,已添加標(biāo)記的副本不會再次更新和提交;它就是一個時間點參考,可以讓您輕松獲得在特定時間點上存在過的代碼副本。當(dāng)將應(yīng)用程序的一個版本發(fā)布到生產(chǎn)中時,會經(jīng)常使用添加標(biāo)記,這樣您可以輕松地找到已部署的代碼版本。回到由John和Josephine組成的演示團(tuán)隊,在做了修改后,他們已經(jīng)準(zhǔn)備好將其代碼發(fā)布到生產(chǎn)中,并且決定將第一個版本稱為版本1.0。作為其發(fā)布的一局部,他們希望標(biāo)記代碼的版本為v1.0,這樣,他們可以清楚地知道哪一個版本的代碼已發(fā)布到生產(chǎn)中,并且可以隨時簽出代碼的1.0版進(jìn)行調(diào)試。Subversion中的標(biāo)記就是一個代碼的副本,按照慣例,放在“tags〞目錄中。為創(chuàng)立標(biāo)記,Josephine在Versioning菜單中選擇

Branch/Tag…:圖38

選擇分支/標(biāo)記Oracle

JDeveloper然后顯示一個對話框,在這里,Josephine可以提供粘貼和復(fù)制的信息庫詳細(xì)位置。Josephine希望標(biāo)記是其當(dāng)前工作副本的代碼,所以她保存了復(fù)制源的默認(rèn)設(shè)置

WorkingCopy。為指定目標(biāo)位置,她在信息庫中指定了一個新的標(biāo)記子目錄:圖39

為標(biāo)記指定位置如果選中

Switchtonewbranch/tag

復(fù)選框,會將Josephine的工作副本指向標(biāo)記而不是指向主干;因為慣例是永遠(yuǎn)不更新標(biāo)記,Josephine希望將她的工作副本繼續(xù)指向主干以便她能繼續(xù)工作,所以她沒有選中

Switchtonewbranch/tag。在Josephine單擊

OK

后,她的工作副本被復(fù)制到v1.0標(biāo)記目錄。如果她使用Web瀏覽器查看信息庫,將看到一個標(biāo)記為v1.0的代碼副本:圖40

Subversion信息庫中新創(chuàng)立的標(biāo)記以后的任何時候,開發(fā)人員可以輕松地使用標(biāo)記的URL作為簽出地址簽出版本1.0的代碼副本。關(guān)于Subversion值得注意的一點是,這樣的代碼副本幾乎不占用空間!Subversion只存儲一個到復(fù)制源的指針;副本不更新,它就幾乎不占用空間。分支和合并當(dāng)開發(fā)團(tuán)隊需要創(chuàng)立一個代碼分支以獨立于主干進(jìn)行更改時,就引出了另一個Subversion常見用例。常見的創(chuàng)立分支的情景是當(dāng)團(tuán)隊嘗試穩(wěn)定代碼為生產(chǎn)發(fā)布做好準(zhǔn)備時;團(tuán)隊的局部成員負(fù)責(zé)查找和修復(fù)錯誤,而團(tuán)隊的其余成員則繼續(xù)為下一版本開發(fā)新特性。穩(wěn)定團(tuán)隊需要擁有其獨立于主干的錯誤修復(fù)代碼分支(將包括還不能用于生產(chǎn)的新特性)。當(dāng)穩(wěn)定團(tuán)隊找到錯誤并修復(fù)時,還需要將這些錯誤修復(fù)傳輸回主干代碼。當(dāng)分支代碼可用于生產(chǎn)時,將對其進(jìn)行標(biāo)記并部署到生產(chǎn)中。要了解分支的其他常見用例,請參閱HYPERLINK借助Subversion進(jìn)行版本控制電子書。我們來演示“針對產(chǎn)品發(fā)布的穩(wěn)定〞用例,其中將用到OracleJDeveloper、Subversion以及我們熟悉的John-and-Josephine開發(fā)團(tuán)隊。John將負(fù)責(zé)準(zhǔn)備應(yīng)用程序的下一個生產(chǎn)發(fā)布(版本1.1),而Josephine將繼續(xù)為版本2.0開發(fā)新特性。John首先要做的是創(chuàng)立一個名為stabilization_1.1的分支。為此,他使用了進(jìn)行標(biāo)記時使用的

Branch/Tag…

命令。這里和標(biāo)記用例主要有兩點不同:首先,按照慣例,分支放在信息庫的Branches子目錄下。其次,因為John想要對分支做出更改,所以他要將他的工作副本改為指向分支。所以,John選擇

Branch/Tag…

并按照如下所示填寫對話框:圖41

Branch/Tag對話框顯示分支的創(chuàng)立在John單擊

OK

后,分支即在信息庫中創(chuàng)立,并且John的本地工作副本改為指向新的分支。注意,分支只是代碼的一個副本—團(tuán)隊中的任何其他成員只需指定相應(yīng)的URL即可簽出分支的工作副本。值得注意的是,任何人都可以同時在其本地系統(tǒng)上存有多個工作副本;例如,John也可以簽出一個主干的副本(放入一個新的目錄),他將有一個指向分支的工作副本,還將有一個指向主干的工作副本。同時,Josephine結(jié)束了在主干上為版本2.0添加新特性的工作。在這里,我將不會顯示她的工作,但是她進(jìn)行了兩組更改并提交給Model工程。John在

PendingChanges

窗口中沒有看到任何Josephine的更改,因為他的工作副本指向stabilization_1.1分支,而Josephine是在主干中做出的更改。現(xiàn)在,John對Hello.java文件做了一些修復(fù),在返回信息中添加標(biāo)點:圖42

John在穩(wěn)定分支中對Hello.java所做的更改當(dāng)John提交他對分支的更改時,注意其更改的版本號是很重要的,這樣他才能將更改合并回主干。Subversion1.5支持自動跟蹤合并,但是

Oracle

JDeveloper11g

不支持Subversion1.5客戶端,所以John必須手動跟蹤合并。John提交他的工作副本并在

SVNConsole-Log

窗口中看到新的修訂號(17):圖43

Log顯示修訂號17注意,Josephine沒有看到John的更改,因為更改發(fā)生在分支里,而Josephine在主干上工作。John如果要將更改合并到主干中,則需要將一個工作副本指定到主干。因為Josephine的工作副本已經(jīng)指向主干,所以我們將她的副本和John的更改合并。John告訴Josephine分支中的修訂17需要合并到主干中。Josephine然后在Versioning菜單中選擇

Merge…:圖44

選擇MergeMerge對話框可能會有一點混亂;Merge…

實際做的只是確定信息庫的兩個不同局部(或修訂)間的差異并將差異應(yīng)用到工作副本。所以,要將John的更改(修訂17)合并到主干中,Josephine需要Subversion確定分支中修訂17和修訂16(之前修訂)的差異并將這些差異應(yīng)用到她的指向主干的工作副本中。因此,她按如下所示填寫了Merge對話框:圖45

在Merge對話框中指定選項當(dāng)她單擊

TestMerge

按鈕時,Oracle

JDeveloper將顯示她的工作副本即將做出的更改(U

意味著文件將更新):圖46

TestMerge的結(jié)果在她單擊

OK

后,John在分支中所做的更改將會合并到她的工作副本中,她可以正常地提交更改。按照慣例,Josephine應(yīng)該在提交注釋中填寫一些描述性文本,以便團(tuán)隊成員可以了解哪些更改已合并到主干中。當(dāng)

Oracle

JDeveloper支持Subversion1.5時,此跟蹤將會自動進(jìn)行:圖47

提供注釋指定合并的更改現(xiàn)在,在John完成分支的穩(wěn)定且分支已可用于生產(chǎn)后,他將按之前所述標(biāo)記代碼。他還將刪除他的本地工作副本(指向stabilization_1.1分支),并簽出一個新的主干副本以便他能在該工程上繼續(xù)工作。一個簡便的方法是,將他的工作副本改為指向分支。為此,他需要選擇Versioning菜單中的

Switch…

并提供主干的位置:圖48

將工作副本重新指向主干Oracle

JDeveloper會將Josephine在主干中所做的更改更新到John的工作副本的所有文件中,并將工作副本中的指針切換到指向主干。最后,因為已經(jīng)不再需要stabilization_1.1分支,所以John將其從信息庫中刪除。為此,他需要顯示

VersioningNavigator

窗口:圖49

顯示VersioningNavigator然后他找到了分支,右鍵單擊該分支并選擇

Delete:圖50

刪除分支如往常一樣,John在對信息庫執(zhí)行此操作時提供了注釋:圖51

刪除分支的注釋總結(jié)您已經(jīng)了解了如何結(jié)合使用

Oracle

JDeveloper11g

和Subversion信息庫在具有多個開發(fā)人員和多個開發(fā)分支的團(tuán)隊環(huán)境中工作。在本系列的第三篇文章中,您將看到開發(fā)人員使用Oracle應(yīng)用開發(fā)框架時可能出現(xiàn)的一些“問題〞。OracleADF開發(fā)必讀:第3局部

借助Subversion進(jìn)行版本控制:防止“問題〞

如何防止在OracleADF工程中使用版本控制時出現(xiàn)的一些常見“問題〞。作者:JohnStegeman

在本系列的HYPERLINK第1局部,您已學(xué)到了安裝Subversion、設(shè)置信息庫和使用OracleJDeveloper11g

執(zhí)行根本操作等基礎(chǔ)知識。在第

HYPERLINK2

局部,您了解了向團(tuán)隊中參加另一個開發(fā)人員時的工作方式。在此第3局部,您將了解使用Subversion對您的OracleADF工程進(jìn)行版本控制時可能產(chǎn)生的一些問題。支持的版本截至本文撰寫之日,OracleJDeveloper11g

支持Subversion版本1.4.x。雖然此版本和更高版本的Subversion效勞器兼容,但是更高版本的Subversion客戶端使用的工作副本格式與版本1.4.x中的工作副本格式并不兼容。如果您在您的開發(fā)設(shè)備上安裝Subversion1.5.x客戶端,切勿使用該版本客戶端軟件對您的工作副本進(jìn)行任何操作。否則,您的工作副本將會悄無聲息地轉(zhuǎn)換為版本1.5,OracleJDeveloper將不再將它識別為工作副本,您將不能再使用內(nèi)置的Subversion命令。檢查您當(dāng)前使用的Subversion客戶端版本的一個簡單方法是使用

svn--version

命令:c:\>svn--versionsvn,version1.4.6(r28521)compiledDec202007,16:19:22

就公用標(biāo)準(zhǔn)達(dá)成一致要確保您的團(tuán)隊使用OracleJDeveloper和Subversion高效工作,您應(yīng)該針對您的ADF工程制定一系列公用標(biāo)準(zhǔn)。(我在第2局部中介紹代碼樣式首選項時提供了一個例如。)另外,您的團(tuán)隊還應(yīng)該統(tǒng)一一些其他標(biāo)準(zhǔn),例如,數(shù)據(jù)庫連接名稱、OracleADF業(yè)務(wù)組件配置設(shè)置等。如果您在工程開始時就制定了一系列公用標(biāo)準(zhǔn),則可防止在后期不得不將所有代碼轉(zhuǎn)換為統(tǒng)一樣式的麻煩。Subversion有一個特性叫做“鉤子〞,可以幫助您在將代碼簽入信息庫時強(qiáng)制執(zhí)行一組公用標(biāo)準(zhǔn)。鉤子是用戶提供的腳本,Subversion會在特定時間運行它,例如在向信息庫提交更改之前。您可以使用開源工具(如

HYPERLINKCheckstyle)輕松地編寫一個預(yù)提交鉤子來檢查Java文件的代碼樣式,并在不符合統(tǒng)一代碼樣式時拒絕文件。還有一個適用于Subversion的框架叫做

HYPERLINKSVNChecker,帶有現(xiàn)成的Subversion鉤子,可以在將代碼提交到信息庫之前,針對代碼調(diào)用Checkstyle。

無法代替交流對版本控制系統(tǒng)的常見誤解是,使用版本控制系統(tǒng)減少了開發(fā)人員之間的交流需求。事實上,使用Subversion或任何其他版本控制系統(tǒng)并不會減少您團(tuán)隊成員之間進(jìn)行交流的需求,并且有可能會增加交流的需求,因為您使用結(jié)構(gòu)化程度更強(qiáng)(而不是結(jié)構(gòu)化程度較低)的方法進(jìn)行開發(fā)。當(dāng)使用OracleADF開發(fā)應(yīng)用程序時,您應(yīng)該特別注意協(xié)調(diào)團(tuán)隊成員在模型層中的開發(fā)活動。此原則對于ADF業(yè)務(wù)組件尤為重要,因為其中的單邏輯對象(如視圖對象)可能包含多個文件。如果兩個開發(fā)人員都嘗試添加或修改同一個視圖對象,就很容易造成多文件構(gòu)成的視圖對象不同步并且變得不可用。要防止該問題,您應(yīng)該確保您的團(tuán)隊成員就他們的工作內(nèi)容進(jìn)行交流。跟蹤外部依賴性當(dāng)您在使用OracleADF開發(fā)應(yīng)用程序時,您的應(yīng)用程序經(jīng)常需要依靠非OracleJDeveloper生成的組件。一個常見的例子是第三方庫的使用;另一個外部組件的常見例子是應(yīng)用程序所依靠的數(shù)據(jù)庫對象。如果您不將您的版本跟蹤方法應(yīng)用于這些外部組件,當(dāng)團(tuán)隊中的一局部成員使用的業(yè)務(wù)組件版本與另一局部成員使用的版本不同時,則可能出現(xiàn)問題。要防止該問題,您應(yīng)該將您的版本跟蹤方法也應(yīng)用于外部組件。現(xiàn)在,讓我們來了解涉及更多常見外部組件時的情況。第三方庫雖然ApacheMaven為實現(xiàn)工程對特定版本的第三方庫的相依性提供了方法,但OracleJDeveloper11g(在本文撰寫時)還沒有對Maven的內(nèi)置支持。而且,不是所有人都在其工程中使用Maven,所以我將介紹另一種方法。出于演示目的,我們假設(shè)您希望在您的例如應(yīng)用程序中使用ApachePOI庫。執(zhí)行此操作的方法之一是將所需的JAR文件下載到每個開發(fā)人員的文件系統(tǒng)上的某個位置,并在OracleJDeveloper中創(chuàng)立一個指向該JAR文件的庫定義。然而,當(dāng)使用該方法時,不同開發(fā)人員的JAR文件版本可能不同,因此會產(chǎn)生問題。要防止此類問題,我使用的方法是創(chuàng)立一個包括所有第三方JAR文件的OracleJDeveloper工程;然后可以將此工程添加到Subversion信息庫中,可以像管理您的應(yīng)用程序源代碼一樣管理該工程。為了演示,讓我們看看團(tuán)隊成員John如何針對

HYPERLINKApachePOI

庫使用此方法。John做的第一件事是從ApachePOI網(wǎng)站下載相應(yīng)的文件。然后,他在其應(yīng)用程序目錄結(jié)構(gòu)中為第三方庫創(chuàng)立了一個目錄:圖1

為第三方庫創(chuàng)立一個目錄接下來,John為POIJAR文件創(chuàng)立了一個子目錄,并將它們從POI分發(fā)解壓縮到該目錄:圖2

解壓縮POIJAR文件在OracleJDeveloper中,John為第三方JAR文件創(chuàng)立了一個新工程。他在之前創(chuàng)立的目錄中創(chuàng)立該工程。他使用ApplicationNavigator中的快捷菜單來完成此任務(wù):圖3

為第三方庫創(chuàng)立一個新工程出現(xiàn)提示時,他選擇GenericProject作為工程類型:圖4

選擇

GenericProjectJohn然后指定了相應(yīng)的工程名稱,并提供了他之前創(chuàng)立的目錄。不需要向此工程中添加任何庫:圖5

指定工程名稱和目錄現(xiàn)在,工程在ApplicationNavigator中可見(盡管當(dāng)將它展開時還看不到有文件):圖6

新創(chuàng)立的工程為了讓POIJAR文件成為工程的一局部,John必須將工程配置為包含工程資源的源路徑中的所有子目錄。為此,John右鍵單擊

3pLibs

工程并選擇

ProjectProperties:圖7

顯示工程的屬性然后,通過展開

ProjectSourcePaths

節(jié)點并選擇

Resources,他可以單擊

IncludeContentfromSubfolders

復(fù)選框以包括工程所有子目錄中的JAR文件。圖8

包括工程資源中的子目錄進(jìn)行完該配置后,現(xiàn)在,POIJAR文件在ApplicationNavigator中將可見:圖9

ApplicationNavigator中的POIJAR文件最后,John通過

PendingChanges

窗口向Sunbversion信息庫中添加四個新文件(一個新工程文件和三個JAR文件),并提交帶有相應(yīng)注釋的更改:圖10

提交新的工程和JAR文件John現(xiàn)在可以創(chuàng)立一個新的包含POIJAR文件的庫定義,并開始在工程中使用ApachePOI。下一次Josephine更新她的工作副本時,她也將看到新的3oLibs工程和ApachePOI文件。將來,如果團(tuán)隊決定更新所使用的ApachePOI的版本,他們可以下載新的版本,用新的版本替換現(xiàn)有的JAR文件,并向信息庫提交更改,以確保整個團(tuán)隊使用同一版本。數(shù)據(jù)庫對象另一個外部依賴性的常見例子是您構(gòu)建應(yīng)用程序所使用的數(shù)據(jù)庫對象(表、存儲過程等)。如果您像許多開發(fā)團(tuán)隊一樣—每個團(tuán)隊成員都使用其自己的開發(fā)數(shù)據(jù)庫—您的團(tuán)隊成員的數(shù)據(jù)庫很可能不同步,從而導(dǎo)致版本問題。為了防止此類問題發(fā)生,您應(yīng)該將您需要的所有構(gòu)件都存儲在您的Subversion信息庫中以保持?jǐn)?shù)據(jù)庫對象為最新。在OracleJDeveloper中,您可以通過多種方法完成此操作,包括:使用離線數(shù)據(jù)庫對象來存儲您的對象定義。當(dāng)對象定義更改后,您可以使用OracleJDeveloper根據(jù)數(shù)據(jù)庫協(xié)調(diào)新的對象定義。使用DDL腳本存儲您的對象定義。數(shù)據(jù)庫模式相對穩(wěn)定后,您可以開始創(chuàng)立用來在切換版本時修改數(shù)據(jù)庫對象的“alter〞腳本。無論您使用什么方法控制對象的版本,不要忘記對常用數(shù)據(jù)工程也(例如存儲在數(shù)據(jù)庫表中的配置數(shù)據(jù),查找值等)要進(jìn)行版本控制。HYPERLINKK.ScottAllen

發(fā)布了一篇很有幫助的HYPERLINK五局部系列,介紹了在數(shù)據(jù)庫中進(jìn)行版本控制的方法,其中包含對數(shù)據(jù)庫進(jìn)行版本控制非常有效的方法。注意開發(fā)中的阻塞點在許多基于OracleADF的應(yīng)用程序中,在向應(yīng)用程序添加新組件的時候會更改一些組件。我將這些組件稱為“阻塞點〞。使用OracleADF開發(fā)的應(yīng)用程序中的兩個常見阻塞點是,模型層中的應(yīng)用程序模塊和視圖層的faces-config.xml文件。如果您的團(tuán)隊在修改這些組件時沒有注意,那么很有可能兩個團(tuán)隊成員同時修改一個文件。大多數(shù)情況下,Subversion不能合并這樣的更改,或者合并的結(jié)果為不可使用的組件(因為合并只作用于文本差異而不是語義差異)。要防止這樣的阻塞點,我根據(jù)團(tuán)隊規(guī)模和開發(fā)進(jìn)展使用下面兩種方法中的一種。第一種方法是指定一個開發(fā)人員來擁有對每一個阻塞點組件的更改;當(dāng)另一個開發(fā)人員需要更改組件時,他/她需要與組件所有者就所需更改良行溝通,然后由所有者進(jìn)行更改并提交給信息庫。此方法的優(yōu)點是它幾乎完全消除了出現(xiàn)沖突和語義錯誤合并的可能性。主要的缺點是,該方法需要開發(fā)人員堅持執(zhí)行手動流程并且將會需要額外的層來進(jìn)行交流,這可能會給開發(fā)過程帶來瓶頸。在實際操作中,我發(fā)現(xiàn)此方法在阻塞點組件的變化較頻繁的開發(fā)初期階段更加實用。第二種方法是允許所有開發(fā)人員對阻塞點組件進(jìn)行更改。如果在提交時發(fā)生沖突或者在更新時發(fā)生合并,開發(fā)人員可以從信息庫恢復(fù)更改之前組件的最新版本(復(fù)原他/她之前對該對象所做的所有更改)并重新將他/她的更改應(yīng)用/編碼到組件中。此方法防止了Subversion的合并操作生成一個不可用對象的可能性,但需要開發(fā)人員在發(fā)生合并/沖突時做更多的工作。在實際操作中,我發(fā)現(xiàn)此方法在阻塞點組件更改頻率較低的開發(fā)后期階段更為實用,因為發(fā)生合并/沖突的幾率也降低了。總結(jié)您已經(jīng)了解了如何結(jié)合使用OracleJDeveloper11g

和Subversion信息庫在具有多個開發(fā)人員和多個開發(fā)分支的團(tuán)隊環(huán)境中工作,并對常見的潛在問題有了一定的了解。您應(yīng)該已經(jīng)可以在任何OracleADF工程中使用Subversion了,無論是在單用戶環(huán)境或是多用戶團(tuán)隊環(huán)境下。OracleADF開發(fā)必讀:第4局部

使用Ant構(gòu)建工程在OracleJDeveloper環(huán)境之外使用ApacheAnt構(gòu)建Oracle應(yīng)用開發(fā)框架工程的技巧。作者:JohnStegeman盡管OracleJDeveloper11g

使得在IDE中編譯應(yīng)用程序、生成部署構(gòu)件(如Java存檔(JAR)、Web應(yīng)用程序存檔(WAR)以及企業(yè)應(yīng)用程序存檔(EAR))和部署應(yīng)用程序變得非常容易,但如果您希望在OracleJDeveloperIDE之外執(zhí)行這些任務(wù),情況又會怎樣呢?例如,您使用的是持續(xù)構(gòu)建工具,或者您需要在一個未安裝OracleJDeveloper的計算機(jī)上構(gòu)建EAR文件。您可以手工編寫腳本來完成這些任務(wù),但這會十分繁瑣。這種情況下,您可以選擇使用類似Ant這樣的構(gòu)建工具。Ant是一個基于Java的構(gòu)建工具,已經(jīng)成為構(gòu)建Java工程的事實標(biāo)準(zhǔn)。您也許聽說過另一個流行的構(gòu)建工具M(jìn)aven,它與Ant的區(qū)別在于,它實施統(tǒng)一的工程結(jié)構(gòu)并提供編譯和構(gòu)建應(yīng)用程序的方法。大多數(shù)現(xiàn)代JavaIDE(包括OracleJDeveloper)都支持Ant構(gòu)建文件的開發(fā),也都支持在IDE內(nèi)部運行這些文件;而Ant也可以獨立于任何IDE運行,這使得它非常適用于上面提到的情況。在OracleJDeveloperIDE中使用Ant既簡單又直觀,因為您可以訪問工程的所有設(shè)置。但是,本文中,我們將解決在OracleJDeveloperIDE之外運行Ant的問題。我將解釋Ant的概念,同時介紹如何建立在未安裝OracleJDeveloper的計算機(jī)上構(gòu)建Oracle應(yīng)用開發(fā)框架(OracleADF)應(yīng)用程序所需的Ant構(gòu)建腳本。Ant的有關(guān)概念構(gòu)建文件。

Ant構(gòu)建文件(在概念上等同于Make實用程序的生成文件)是XML文件,描述了構(gòu)建特定

目標(biāo)

所需的

任務(wù)

及目標(biāo)之間的依賴性。盡管通常將Ant構(gòu)建文件命名為

build.xml,但您不一定非要遵守這一命名規(guī)則。目標(biāo)。

目標(biāo)是Ant構(gòu)建文件的根本構(gòu)建塊,類似于生成文件目標(biāo)。常用/慣用的目標(biāo)包括:clean

—刪除臨時目錄、類文件、JAR文件和其他生成的構(gòu)件init

—設(shè)置構(gòu)建文件的所有初始屬性(按照慣例,構(gòu)建文件中的大局部其他目標(biāo)將取決于

init

目標(biāo)。)prepare

—創(chuàng)立其他目標(biāo)所需的任何臨時/輸出目錄(此類目錄的一個例如是.java源代碼文件編譯到的classes目錄)compile

—編譯應(yīng)用程序的.java源代碼文件deploy

—將應(yīng)用程序部署到應(yīng)用效勞器(通常,應(yīng)用效勞器供給商提供的自定義Ant任務(wù)支持該目標(biāo)。)jar/war/ear

—創(chuàng)立JAR/WAR/EAR文件任務(wù)。

Ant任務(wù)是構(gòu)建目標(biāo)時必須遵循的一系列步驟。Ant有100多個內(nèi)置任務(wù),如調(diào)用Java編譯器、創(chuàng)立JAR文件和調(diào)用Javadoc工具。另外,由于Ant是基于Java的,因此您可以編寫自己的Ant任務(wù)并將它作為構(gòu)建目標(biāo)的一局部進(jìn)行調(diào)用。依賴性。

Ant依賴性是一種以聲明方式控制目標(biāo)構(gòu)建順序的機(jī)制。例如,必須先將應(yīng)用程序源代碼編譯為.class文件,然后才能構(gòu)建JAR文件。在本例如中,假設(shè)Ant構(gòu)建文件包括

compile

jar

目標(biāo),我們可以說

jar

依賴于

compile。這樣,當(dāng)您讓Ant構(gòu)建

jar

目標(biāo)時,Ant將自動保證首先構(gòu)建

compile

目標(biāo)。實際上,Ant足夠智能,它知道磁盤上的.class文件是否是最新的,僅在需要時執(zhí)行實際的“compile〞任務(wù)。您可以閱讀HYPERLINK在線手冊、受好評的書籍

HYPERLINKAntinAction

以及可在互聯(lián)網(wǎng)上搜索到的許多在線教程,來了解有關(guān)Ant的更多信息。有關(guān)ojdeploy的說明OracleJDeveloper11g

包括一個新命令行工具ojdeploy,該工具可以通過引用應(yīng)用程序(jws)和

工程(jpr)文件中的信息來編譯和創(chuàng)立JAR/WAR/EAR文件;ojdeploy還具有一個對應(yīng)的Ant任務(wù),因此您可以使用與Ant相同的功能。然而,ojdeploy(命令行工具和Ant任務(wù)均如此)的缺乏之處在于它需要在您進(jìn)行構(gòu)建的計算機(jī)上安裝OracleJDeveloper。另外,在撰寫本文時,發(fā)現(xiàn)ojdeploy的Ant任務(wù)中似乎有一個HYPERLINK錯誤,該錯誤使ojdeploy無法正確創(chuàng)立應(yīng)用程序EAR文件。為了避開這兩點缺乏,本文將向您介紹在不使用ojdeploy的情況下如何使用Ant構(gòu)建應(yīng)用程序。使用Ant構(gòu)建OracleADF工程的概述在本文中,使用本系列文章前面幾局部中使用過的HYPERLINK例如工程。您的目標(biāo)是創(chuàng)立一組Ant構(gòu)建腳本,可以用這些腳本從Subversion中簽出應(yīng)用程序的一個副本,并且在只安裝了Java開發(fā)工具包(JDK)和Ant軟件的“干凈的〞計算機(jī)上(未安裝OracleJDeveloper或OracleWebLogicServer)構(gòu)建該應(yīng)用程序。能夠在干凈的計算機(jī)上構(gòu)建應(yīng)用程序?qū)⑹鼓梢允褂帽鞠盗形恼潞罄m(xù)局部所介紹的其他技術(shù),如使用持續(xù)集成效勞器。按照以下步驟創(chuàng)立構(gòu)建腳本:創(chuàng)立一個OracleJDeveloper工程,用來存放通常由OracleJDeveloper提供的OracleADF庫和其他庫。只有執(zhí)行了這個步驟,在“干凈的〞計算機(jī)上才能使用所需的庫。創(chuàng)立一個包含所有需要的庫的庫定義的Ant腳本。確定組成所需庫的JAR文件并將它們從OracleJDeveloper安裝目錄復(fù)制到新工程的目錄中。創(chuàng)立一個用于編譯

Model

工程的Ant構(gòu)建腳本。創(chuàng)立一個用于編譯

ViewController

工程的Ant構(gòu)建腳本。創(chuàng)立一個用于創(chuàng)立WAR/EAR文件的Ant構(gòu)建腳本。本文的其余局部將向您介紹如何完成上述每個步驟。安裝JDevLibsForAnt擴(kuò)展本文中的例如使用一個OracleJDeveloper擴(kuò)展來幫助管理Ant構(gòu)建腳本中的OracleADF庫。安裝JDevLibsForAnt:在OracleJDeveloperHelp菜單中,選擇

CheckforUpdates。圖1

檢查更新瀏覽Welcome頁面(如果顯示),然后單擊

Next。圖2

CheckforUpdates向?qū)У腤elcome頁面確保至少選中

OpenSourceand

Partners

選項:圖3

選擇要搜索的更新中心選擇JDevLibsForAnt擴(kuò)展,然后單擊

Next。圖4

選擇JDevLibsForAnt擴(kuò)展單擊CheckforUpdates的Summary頁面中的

Finish。圖5

CheckforUpdates的Summary頁面現(xiàn)在,工程在ApplicationNavigator中可見(盡管將它展開時還看不到有文件):當(dāng)提示您完成擴(kuò)展的安裝時,重啟OracleJDeveloper。當(dāng)詢問您是否從以前的版本遷移用戶設(shè)置時,答復(fù)

No。為OracleJDeveloper庫創(chuàng)立一個工程為了在未安裝OracleJDeveloperIDE時可以編譯OracleADF應(yīng)用程序,Java編譯器需要訪問應(yīng)用程序使用的OracleADF庫和其他需要的庫。可以使用諸如

HYPERLINKMaven

HYPERLINKIvy

之類的工具來幫助自動管理庫依賴性;不過,當(dāng)庫定義中包含一個公有/私有信息庫時,這些工具最有效。截至撰寫本文時,沒有針對OracleADF庫的公有Maven信息庫。我使用“ADF必讀〞系列文章的

第三局部中用于管理第三方庫中概要介紹的方法來確保這些庫對應(yīng)用程序是可用的。如果您對應(yīng)用程序進(jìn)行設(shè)置,使其包括一個含有OracleJDeveloper庫的JAR文件的工程,您將能夠在未安裝OracleJDeveloper的計算機(jī)上構(gòu)建該應(yīng)用程序。如果您一直跟隨本系列文章中的工程例如,您將有一個包含三個工程的應(yīng)用程序,如下所示。圖6

目前包含三個工程的應(yīng)用程序第一步是創(chuàng)立一個新工程來存放OracleJDeveloper庫。為此,轉(zhuǎn)到ApplicationNavigator的快捷菜單,選擇

NewProject。圖7

創(chuàng)立新工程出現(xiàn)提示時,選擇

GenericProject

類型。圖8

選擇GenericProject最后,為工程指定一個描述性的名稱,如JDeveloperLibs。您不需要為該工程選擇任何技術(shù),因為該工程只是所需庫以及您將在下一步中創(chuàng)立的相關(guān)聯(lián)的Ant腳本的占位符:圖9

為新工程命名現(xiàn)在,您的新應(yīng)用程序應(yīng)該如下面的屏幕截圖所示:圖10

包含新JDeveloperLibs工程的應(yīng)用程序如果您對工程使用了版本控制,現(xiàn)在應(yīng)該是添加新工程的最正確時機(jī)(這里未給出該步驟)。設(shè)置JDeveloperLibs工程的庫引用下一步是對新工程進(jìn)行設(shè)置使其引用應(yīng)用程序所需的全部庫。為此,您需要確定應(yīng)用程序中所有工程引用的全部庫。首先,我們來找出Model

工程使用的庫。為此,雙擊

Model

工程以顯示該工程的屬性,然后在屬性窗口中選擇

LibrariesandClasspath

類別。圖11

Model工程的庫記下該工程引用的所有庫(該例如中有11個)。然后取消

ProjectProperties

對話框,再雙擊

JDeveloperLibs

工程以顯示它的屬性。最后,單擊

AddLibrary

按鈕,添加您在

Model

工程中記下的所有庫。雖然庫的順序沒有關(guān)系,但您會發(fā)現(xiàn)如果對它們排序會更加方便。接下來,對

ViewController

工程重復(fù)同樣的過程,從

ViewController

工程向

JDeveloperLibs

工程添加所有其他庫引用。注意,來自

Model

工程的庫與來自

ViewController

工程的庫可能會有重疊;無需將某個庫添加兩次。添加完庫引用后,您的

JDeveloperLibs

工程所引用庫的列表應(yīng)如下所示(同樣,庫的順序也無關(guān)緊要):圖12

JDeveloperLibs工程的庫的完整列表創(chuàng)立jdev-libs.xmlAnt腳本下一步是創(chuàng)立一個Ant腳本,它包含應(yīng)用程序所引用的全部庫的庫定義。為此,您將需要使用之前安裝的JDevLibsForAnt擴(kuò)展。首先需要配置該擴(kuò)展;為此,雙擊

JDeveloperLibs

工程以顯示

ProjectProperties

對話框,然后選擇

JDevLibsForAnt

類別。接著指定文件名jdev-libs.xml作為輸出文件的位置,然后單擊

OK。圖13

配置JDevLibsForAnt現(xiàn)在,您可以使用

JDevLibsForAnt

擴(kuò)展來創(chuàng)立一個文件(該文件名為jdev-libs.xml),它包含到所有OracleJDeveloper庫的路徑引用。為此,右鍵單擊

JDeveloperLibs

工程并選擇

mergeJDevLibsForAnt。圖14

運行mergeJDevLibsForAnt運行

mergeJDevLibsForAnt

后,在ApplicationNavigator中單擊

Refresh

按鈕,查看是否創(chuàng)立了

jdev-libs.xml

文件。圖15

層次結(jié)構(gòu)中的jdev-libs.xml文件最后,通過如下所示的全局查找替換來刪除

jdev-libs.xml

中對JDeveloper主目錄的引用:圖16

ADF模型運行時庫定義這將確保路徑引用指向JDeveloperLibs工程目錄,而非JDeveloper安裝目錄。將OracleJDeveloper庫復(fù)制到JDeveloperLibs工程目錄如果您希望能夠編譯和構(gòu)建您的OracleADF應(yīng)用程序,在編譯時相應(yīng)的庫必須是可用的。您在OracleJDeveloper中構(gòu)建應(yīng)用程序時,沒有任何問題,因為OracleJDeveloper安裝目錄中提供了庫的JAR文件。為了支持在未安裝OracleJDeveloper的計算機(jī)上進(jìn)行編譯,您需要以另一種方式提供JAR文件。通過將JAR文件復(fù)制到

JDeveloperLibs

工程目錄并將它們添加到版本控制中,即可實現(xiàn)上述目的。這樣,任何簽出應(yīng)用程序副本的人也將同時獲得所需的JAR文件。首次復(fù)制庫文件時可能非常麻煩,但一旦完成了一次復(fù)制后,將無需再執(zhí)行此操作。如果您升級了OracleJDeveloper或安裝了補(bǔ)丁,則只需刷新JAR文件。如果您向應(yīng)用程序工程添加了其他的庫,則需要添加新庫。要復(fù)制庫的JAR文件,您將需要使用

jdev-libs.xml

文件作為引用。您需要從JDeveloper主目錄復(fù)制JAR文件,并且要保持相同的目錄結(jié)構(gòu)。例如,我們來使用ADF模型運行時庫:圖17

包含來自子文件夾的內(nèi)容要復(fù)制該庫的JAR文件,您需要在

JDeveloperLibs

工程目錄中創(chuàng)立同樣的目錄結(jié)構(gòu),然后從JDeveloper安裝目錄中復(fù)制引用的JAR文件。需要注意的一點是,某些提供的JDeveloper庫定義引用了不存在的文件!JDevLibsForAnt擴(kuò)展會幫助在生成的腳本中標(biāo)記這些文件;在本例如中,有五個“喪失的〞JAR文件您無需復(fù)制。例如,我們來看一下作為ADF模型運行時庫定義一局部的第一個JAR文件identitystore.jar。您會在<JDEVELOPER安裝目錄>/jdeveloper/modules/oracle.idm_11.1目錄中找到該文件。您應(yīng)該在

JDe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論