問題
源代碼管理(SCM)產品用於管理多個版本的項目文件,允許您保存新版本、恢復較舊版本以及在不同版本之間進行比較。當您在修改項目的過程中引入了bug,這將是一個非常有價值的功能。大多數較新源代碼管理(SCM)產品除了可管理各文件的版本之外,還提供了在 Bell 實驗室中開發的源代碼控制系統(SCCS)。
即使對於小型項目,每一位開發人員也應該使用源代碼管理(SCM)。小型項目轉變成大型項目是必然的事情,雖然從工作上說僅僅需要修復錯誤和添加功能。跟蹤和管理軟件的能力是獲得成功的關鍵因素。
應用程序部署有時也會出現問題:需要將正確的文件 —— Java Descriptor (JAD) 和 Java Archive (JAR) ——放置在 Web 服務器文件根目錄(docroot)下的正確位置。擁有一個自動化解決方案要比手動流程更加簡單。
本技術文章使用以下組件:
NetBeans IDE
Subversion 源代碼管理 —— 客戶機和服務器
Sun Java System Web Server
Sun Ultra 25 工作站(我將它稱作 peg),它運行在 Solaris 10 OS 上,允當 Subversion 服務器和 Web 服務器
Microsoft Windows XP 操作系統的虛擬 PC, 使用 NetBeans IDE 進行Java ME 開發
Subversion
Subversion,通常稱作 SVN,是一個能在很多平台上運行的、開源的源代碼管理(SCM)系統。在本文中,SVN 服務器在 Sun Ultra 25 工作站上運行,客戶機軟件在 Windows XP 中運行。服務器安裝所使用的包可從 Sunfreeware.com 上獲得。Sunfreeware.com 是一個提供開源包(從Solaris OS 發行版的長列表中可得)的受歡迎的網站。
要安裝服務器,簡單下載 pkgtrans 和 pkgadd 即可。在此過程中的惟一不好之處就是下載和安裝 Subversion 在 Solaris 10 OS 上運行所需要的 11 個其他包。
我將所有的 SVN 存儲庫存放在一個單獨目錄中。這樣簡化了 SVN 服務器的運行環境。同時有助於各種存儲庫的備份。
服務器與系統一起使用 /etc/init.d 進行啟動。SVN 的 rc 文件 /etc/init.d/svnserve 包含下列內容:
#!/sbin/sh
#
# SVNSERVE - manage the SVN server.
#
case "$1" in
'start')
if [ -x /usr/local/bin/svnserve ]; then
/usr/local/bin/svnserve -d -r /export/home/shared/svn/
fi
;;
'stop')
if /usr/bin/pgrep svnserve >/dev/null 2>&1; then
pkill svnserve
fi
;;
'restart')
/etc/init.d/svnserve stop
/etc/init.d/svnserve start
;;
esac
exit 0
這是到/etc/rc2.d/S98svnserve 的硬連接。結果是,當系統啟動時,SVN 服務器也啟動。
Web 服務器
我使用 Sun Java System Web Server 7.0。
對於 Solaris OS 的安裝是標准的:我將目標目錄設置到 /opt/webserver7,並選擇 start server at boot time(在引導時間啟動服務器) 選項。正因為我把所有 SVN 存儲庫放在了一個單獨目錄中,所以我在單獨目錄中保留了許多文件根。容器目錄是 /export/home/shared/docroots。重申一下,這種做法有助於備份,並且當請求發出指令時提供了易於切換文件根的能力。在本次練習中我將文件根目錄設置到 /export/home/shared/docroots/marejka.dyndns.org/。
Netbeans IDE 支持基於 Web 的創作和版本控制(Web-based Distributed Authoring and Versioning,WebDAV)(是部署協議中的一種),web 服務器支持 WebDAV。因此我使用 WebDAV 作為 MIDlet 套件部署協議。
一旦服務器打開並運行,我將按照這些配置步驟通過 Netbeans IDE 來啟用 MIDlet 的 WebDAV 部署。
在服務器 (peg) 上在用於部署 JAD 和 JAR 文件的文件根下創建目錄。
使用 keyfile 身份驗證來創建一個 WebDAV 訪問所需要的用戶和密碼值對。
在服務器層啟用 WebDAV。
在虛擬服務器(virtual-server)層創建 WebDAV 收集。
將 JAD 文件的 MIME 類型添加到服務器。
/jadpool 目錄
我們需要在 web 服務器的文件根下找到一些位置提供給 JAD 和 JAR 文件。我選擇 jadpool 作為目錄名稱。jadpool 是關於短語 基因庫(gene pool) 方面的游戲名。
在服務器上使用下面的代碼作為用戶根創建目錄是一件簡單的事情,這些代碼是:
cd /export/home/shared/docroots/marejka.dyndns.org
mkdir jadpool
chown webservd:webservd jadpool
結果顯示在圖 1 中。
圖 1:Webserver 根文件目錄列表。
身份驗證
我不想對身份驗證這一相當直觀的過程進行詳細介紹。在基於浏覽器的 Web 管理控制台(Web Server Admin Console)內,在 Configurations > peg 下,我選擇訪問控制(Access Control)選項卡執行兩項任務:
創建一種稱作 keyfile 的密鑰文件(Key File)的身份驗證數據庫
創建一個用戶 —— 例如, richard -- 並給用戶一個密碼
請注意,我沒有創建任何用戶組,也沒創建或修改任何訪問控制列表(Access Control Lists,ACL)。
WebDAV
要在服務器上啟用 WebDAV,需要選擇一個單獨的復選框。復選框位於 Configurations > peg 頁面、選項卡 General 和次選項卡 WebDAV 上。我選擇了 WebDAV,如下表 2 所示,並參考了我已經創建的密鑰文件 keyfile 驗證了身份驗證數據庫。
圖 2:在服務器配置層啟用 WebDAV。
接下來我需要在虛擬服務器層創建 WebDAV 收集。再次使用 Web 服務器管理控制台(Web Server Admin Console),我不斷向下挖掘直至到達 Configurations > peg > Virtual Servers > peg 頁面,並選擇 WebDAV 選項卡,如圖 3 所示:
圖 3:虛擬機服務器 —— WebDAV 收集。
選擇 New 選項,呈現一個彈出窗口 New WebDAV Collection。我指定了 /jadpool 作為 URI,並將 Source URI 空著,然後單擊 Next 按鈕。圖 4 顯示了 WebDAV 初始創建頁面。
圖 4:WebDAV 收集創建 —— URI 信息。
單擊 Next 按鈕,引導至訪問控制(Access Control)頁面,如圖 5 所示。出於安全意識,我通過選擇“Allow the following users in the authentication database(允許在身份驗證數據庫中的用戶訪問)”選項限制訪問,並把我自己放入用戶身份(ID)列表中。
圖 5:WebDAV 收集創建 —— 訪問控制(Access Control)
再次單擊 Next 按鈕,我們進入了 Review 頁面,如圖 6 所示。快速審查一遍各個參數,果敢地單擊 Finish 按鈕就創建了 WebDAV 收集。
圖 6:WebDAV 收集創建 —— 審查並運行。
如果需要,使用收集屬性頁面可以確定我的 /jadpool WebDAV 收集屬性。在圖 3 中的相同頁面上開始並選擇一個已有的收集,圖 7 向我顯示了一個屬性頁面。
圖 7:WebDAV 收集屬性 —— /jadpool。
MIME 類型
最後,我將 MIDlet 套件的 MIME 類型添加到 web 服務器。在服務器上設置 MIME 類型意味著 JAD 文件的請求將不僅提供正確的文件,而且將在 HTML 響應中正確地設置Content-Type 頭文件。JAD 文件的 MIME 類型是text/vnd.sun.j2me.app-descriptor。在 web 服務器的服務器配置中的 General 選項卡下,MIME Types 次選項卡中添加了 text/vnd.sun.j2me.app-descriptor,單擊 New 按鈕,然後單擊 OK 按鈕,我就做完了。
圖 8 顯示了在 peg 上的結果。
圖 8:Web 服務器的 MIME 類型。
此時,服務器端已經被安裝和配置,並正在運行。如果服務器重新啟動,web 服務器和 Subversion 服務也將重新啟動。現在,讓我們轉向 NetBeans IDE。
NetBeans IDE
向 NetBeans IDE 添加 Subversion 支持需要兩個很簡單的步驟。首先通過使用 Tools > Update 機制添加 Subversion 模塊。在列表中找到 SVN ,將它添加到更新列表中,單擊幾次,就下載並安裝了 SVN。
您還需要為 Windows 下載 Subversion 客戶機。我從 subversion.tigris.org 中下載了預生成二進制代碼,並對它們進行了安裝。最後,我重新啟動了 NetBeans IDE 以便找到您剛才安裝的 Subversion 的客戶機軟件。
一旦您已經重新啟動,您要注意 Subversion 會在項目右鍵單擊(right-click)菜單上和 NetBeans IDE 菜單條中出現,如圖 9 所示。
圖 9:NetBeans 項目菜單。
SVN 導入
在第一次嘗試提交存儲庫之前,您必需確保所述存儲庫存在。這需要一些服務器端操作:創建目錄和確定至少一個已經過身份驗證的用戶。
使用下列代碼作為根:
peg# cd /export/home/shared/svn
peg# /usr/local/bin/svnadmin create bonjour
peg# vi bonjour/conf/passwd
密碼文件應以下列代碼結束,如下所示:
[users]
richard = password
密碼存在的地方當然不是顯而易見的。您可能還想將 passwd 文件的權限降低至下列情形:
-rw-r----- 1 root root 27 Nov 30 16:29 passwd
這樣只允許用戶根或用戶組根具有閱讀文件的能力。
現在您已經准備好初始簽入(check-in),在 NetBeans IDE 中稱作導入。要開始這一過程,打開菜單條,選擇 Subversion > Import into Repository 選項。NetBeans 將需要您通過三個步驟。首先,指定存儲庫和經過身份驗證的用戶,如圖 10 所示。
圖 10:SVN 導入 —— 確定存儲庫。
其次,NetBeans 請求給出存儲庫文件夾位置,如圖 11 所示。
圖 11:SVN 導入 —— 指定文件夾名稱。
最後,NetBeans 向您顯示將要導入的文件列表,如圖 12 所示。
圖 12:SVN 導入 —— 文件導入列表。
單擊幾次 Next 按鈕和 Finish 按鈕,您的資源被安全地保存到 Subversion 存儲庫中。
SVN 簽出
一旦簽入,項目就可以通過 Subversion 客戶機被簽出。在 NetBeans IDE 菜單下,選擇 SVN > Checkout,然後將會出現 Checkout 窗口。輸入 Repository URL。在這種情況下,我們使用內部 URL svn://peg/bonjour 並提供用戶 —— 密碼值對,如圖 13 所示:
圖 13:SVN 簽出 —— 指定存儲庫。
接下來,選擇要簽出的文件夾,如圖 14 所示,Browse 選項對直觀檢查存儲庫要選擇的內容意義重大。一旦您已經選擇了簽出內容,單擊 Finish 按鈕。
圖 14:SVN 簽出 —— 確定文件夾。
NetBeans IDE 將檢測您正在簽出的項目,並給您提供打開項目的選項。選擇 Open Project 選項,如圖 15 所示。
圖 15:SVN 簽出 —— 打開項目選項。
打開項目之後,選擇 Clean and Build Main Project 以確保所有項目均處於工作狀態。
您現在可以對資源進行計劃好的任何修改。在您自己的項目空間中添加功能、錯誤修復或調優算法。使用 Run > Run Main Project 菜單項部署之前,您可以使用運仿真器來測試您的更改。
部署
最後,您將希望在真實環境中測試您的 MIDlet。再沒有比給設備安裝無線下載(over-the-air,OTA)更實際的了。但是,創建一個可以安裝並將其部署到 web 服務器上的 MIDlet 套件可能是一項挑戰。
在這裡,有時很困難的處理變得很容易了。MIDlet 套件的部署要求在某些 web 服務器上的文件根下放入 JAD 文件和 JAR 文件。JAD 文件通過使用 MIDlet 屬性描述了含有 JAR 文件的 MIDlet 套件。
文章 檢索 MIDlet 屬性 提供了關於 JAD 文件語法和上下文的更多詳細資料。在 JAD 文件中需要 8 個屬性來定義能在設備上成功安裝的 MIDlet 套件。JAR 文件包含 MIDlet 套件和所有所需資源。NetBeans IDE 自動部署的功能將不僅在 web 服務器上安裝文件,而且還將自動生成正確的 JAD 文件。請注意,在應用程序描述符(Application Descriptor)類別下任何新增用戶內容也將添加到被生成的 JAD 文件中。
如果您第一次經歷自動部署過程,您必需在項目屬性的 Deploying 類別中提供所有表單信息。選擇 WebDAV 部署方法,並提供服務器名稱或使用端口號提供 IP 地址、目標目錄和 WebDAV 用戶 —— 密碼值對。在 web 服務器上,所有的 JAD 文件和 JAR 文件在一個目錄中保留:/jadpool。再者,將這些文件放在一個地方使部署和備份更易於管理。請注意,我使用在 JAD 選項中的 Override JAR URL,如圖 16 所示,因為用於部署的服務器名稱(peg)對我的網絡來說是本地連接,而發布的 URL 使用 可接入互聯網的(Internet-visible)服務器名稱 marejka.dyndns.org。
圖 16:NeBeans 項目部署屬性。
填充了所有的 Deploy 類別數據之後,在項目上右鍵單擊並選擇 Deploy,將 JAD 文件和 JAR 文件推送(push)到服務器中。如果您已經正確地配置了服務器,那麼部署過程在 1 秒鐘之內就可完成。