在上一節中,我介紹了打包和部署的基本慨念及其角色和使用限制,在這一節中我將向大家介紹打包應用程序的具體方法。
打包J2EE應用程序
一個J2EE應用程序可以被打包為一個可移植的部署單元,稱為商業檔案文件(enterprise archive)。一個商業檔案文件是一個標准的Java檔案文件並帶有ear擴展名。這樣的文件包括一個或多個J2EE模塊及一個J2EE應用程序的部署描述文件。
J2EE應用程序的制作過程主要分為兩步:首先,應用組件提供商負責開發EJB模塊、Web層程序和應用客戶模塊。其次,應用程序集成商將這些模塊打包在一起以創建一個可以部署的J2EE應用模塊。同時應該說明的是,所有J2EE模塊都是獨立的可部署單位。這使組件提供者無需實現全部應用即可開發獨立的功能單元。
但是,我們需要對具體的打包概念和操作有一定理解。下圖1說明各種類型的J2EE 模塊(EJB、Web、應用客戶和應用程序)及它們怎樣被部署。雖然這個圖只顯示了一個獨立的被部署的EJB模塊,但是所有這四種類型的J2EE模塊都可以被獨立地部署。為了整合一個應用程序,應用程序整合人員將通過設定相應模塊的部署描述文件之間的連接來解決組件之間的依賴關系。每個組件都可能在同一個檔案文件中與其他組件具有依賴關系,或是在不同檔案文件中。這些依賴關系都必須在部署之前解決。整合人員要保證相同組件在不同的檔案文件中的描述保持一致。
圖1 J2EE程序包結構
J2EE規格對於組件和部署單元設置一定數量的需求,多數來說都是為適當的組件操作而准備的,但是組件容器並不需要實時執行這些規則中的大多數。
1、EJB模塊
一個EJB模塊通常被包裝和部署為EJB Java檔案文件和一個帶有jar擴展名的Java 檔案文件。這是ejb最小的可部署和可使用單位。一個標准的EJB模塊包括:
1) Java類文件,包含enterprise bean定義及其本地和遠程接口;
2) EJB代碼中所依賴的Java類文件。這裡是指在J2EE平台之外的代碼文件;
3) EJB部署描述文件,其提供了應用程序中用於enterprise bean的結構和整合信息。通常來說整合信息是可選的,並且只包含在整合應用程序中。
應該說明的是,ear文件與標准的jar文件存在顯著的區別:ear文件包含一個部署描述文件,它包含了一個或多個enterprise bean的主要形容信息。
EJB Java檔案文件除了可以在服務器端使用之外,一個EJB Java檔案文件開發人員還可以開發包含用戶程序需要訪問的EJB類文件,這些類大多數包含在EJB Java檔案文件。應該注意的是,服務器端的組件實現類文件通常不會包含在客戶端的Java檔案文件。在EJB Java檔案文件中或client Java檔案文件中的類可以直接在類文件中引入,或在外部引用中聲明。
2、EJB模塊打包准則
1) 如何將組件打包成EJB模塊
一個典型的商業應用通常包括多個ejb,其中一些ejb可能是商用組件,或是其他的第三方庫函數;而應用集成人員可能從以下方法中選擇:
a、將應用程序中的每個ejb包裝在自己的EJB模塊中。在這種方法裡,每個ejb具有自己的部署描述文件並與其依賴的類文件一起打包在ejb模塊中。這個方法的好處在於它可以最大化每個ejb的可重用性,並留給應用集成人員很大的自由在ejb模塊中選擇以建立J2EE應用程序。如果開發人員的ejb具有很強的可重用性,這種方法是值得推薦的。在這種情況下,應用集成人員可以准確地重復利用他們希望重復利用的那些ejb。
b、在同一個EJB模塊裡包裝應用程序中所有ejb。在這種方法中,所有ejb和它們的依賴類被一起包裝在一個EJB模塊裡。這種方法較其他方法實施起來是最簡單的。
c、將所有與一個應用程序有關系的ejb打包在一個EJB模塊裡。在這種方法中,所有的ejb將根據它們功能上的特性分類並放置在同一個ejb模塊中。
在以上幾種方法中,第三種選擇模塊性最好,並被許多J2EE應用程序采用。這主要是因為這種方法可以取得可重用性和簡單性的平衡。同時它也促進了第三方組件的黑箱操作,這對於包含很多數字簽名的組件的應用系統是十分重要的。另外這種方法在J2EE服務器需要部署在不同Java虛擬機上的各個ejb模塊時尤其有效,它可以將相關聯的ejb編組在一起,同時允許遠程調用。
1、JNDI命名空間內的本地接口
大多數EJB實現程序都是通過Java命名和目錄接口(Java naming and directory interface)來定義ejb本地接口的,一個部署描述文件通常會將組建的ejb命名編入進其JNDI命名中。不過由於通常沒有對本地接口的遠程訪問,本地接口是無需在全局的JNDI命名空間內公布的。在組件通過JNDI尋找本地接口時,ejb容器並不需要通過JNDI命名空間到處提供本地bean的實現,相反地,ejb容器需要實現所有本地接口的JNDI查找,並根據請求返回相應的對象。
2、EJB模塊部署建議
ejb類文件通常會有沒在bean本地和組件接口聲明的公共方法。部署描述文件不應該為這些方法制定事務或安全屬性。由於ejb容器只會作用於公共組件或本地接口的方法調用,所以它可以為這些方法提供事務支持或安全限制。
在某些時候,容器管理的實體bean的主鍵類可能對於組件提供商來說是未定義或未知的,這時,開發人員可以將實體bean的部署描述文件中的主鍵設置為java.lang.Object。
一些實體bean可能作用於數據庫中的商業數據,包括在容器管理的持久性下管理和更新這些數據。開發人員需要認識到如果取消這些bean的部署,那麼它們所管理的數據表格也將會被刪掉。同時,相同的組件也可能在一個應用程序的多個地方被應用,而當這些bean使用容器管理的持久性時,開發人員需要考慮是否將該組件的所有實例存儲在一個表中或多個表中,並適當地配置其持久性行為。
3、Web模塊
Web模塊通常是被打包並部署為Web檔案文件(Web archive,WAR),即Java檔案文件帶有.war擴展名。這種文件也是Web資源中最小的可部署和可用單元。通常一個Web模塊包含:
1) Servlet的Java類文件及其依賴文件;
2) JSP文件及其幫助類;
3) 靜態文檔,html頁,圖像,聲音文件;
4) Java Applet及類文件;
5) Web部署描述文件。
與其他部署單元類型不同,WAR文件通常不能由一個類載器(classloader)上載,這主要由於其內部結構和一個可載入的JAR文件是不同的;與其他模塊類型一樣,一個WAR文件可以作為一個Web應用獨立地部署或包含在EAR文件中,一起部署為一個J2EE應用程序。
應用客戶模塊
應用客戶模塊通常是打包在Java檔案文件並帶有.jar擴展名,應用客戶模塊通常包括實現客戶端程序的Java類文件和應用客戶部署描述文件; 一個應用客戶通常會使用EJB JAR文件提供商提供的客戶jar文件,而這個客戶jar文件由用戶需要訪問的ejb類文件組成。