明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

J2EE應(yīng)用部署(一):基礎(chǔ)篇

[摘要]提綱: =================================== 一、基礎(chǔ)知識 1.1 J2EE應(yīng)用的構(gòu)成 1.2 封裝和部署操作的任務(wù) 1.3 不能封裝到EAR文件的組件 二、類裝載模式 2.1 在EJB 2.0之前 2.2 ...
提綱:
===================================
一、基礎(chǔ)知識
1.1 J2EE應(yīng)用的構(gòu)成
1.2 封裝和部署操作的任務(wù)
1.3 不能封裝到EAR文件的組件
二、類裝載模式
2.1 在EJB 2.0之前
2.2 在EJB 2.0之后
===================================
正文:
===================================

一、基礎(chǔ)知識
1.1 J2EE應(yīng)用的構(gòu)成
J2EE應(yīng)用由以下兩種資源構(gòu)成:
一個或者多個J2EE組件
一個J2EE應(yīng)用部署描述器(Deployment Descriptor)

當(dāng)多個異種的J2EE組件需要相互調(diào)用時,我們必須創(chuàng)建一個J2EE應(yīng)用。在創(chuàng)建J2EE應(yīng)用的過程中,有許多事情必須考慮,其中包括:
有哪些類型的組件可以封裝到J2EE應(yīng)用里?
創(chuàng)建J2EE應(yīng)用的過程中,人們擔(dān)負的各種職責(zé)。
當(dāng)前J2EE封裝技術(shù)的局限之處。

為滿足J2EE組件交互的需要,不同的供應(yīng)商所采取的類裝載策略。

J2EE規(guī)范區(qū)分了兩類資源:可以在容器之內(nèi)運行的資源,可以封裝到EAR文件內(nèi)的資源。EAR是Enterprise Application ARchive的縮寫,EAR文件用來把一個或者多個J2EE組件封裝到單個模塊里面,以便一起部署并裝入到服務(wù)器上。

J2EE規(guī)范闡明了運行時容器和部署模塊之間的區(qū)別。運行時容器是請求級的截取機制,為系統(tǒng)內(nèi)的組件提供一種基礎(chǔ)服務(wù)。部署模塊是一種為那些最終將在運行時容器內(nèi)執(zhí)行的組件提供的封裝結(jié)構(gòu)。下圖描述了J2EE容器的結(jié)構(gòu):
其中:
EJB容器

EJB容器用來容納業(yè)務(wù)邏輯,并為業(yè)務(wù)邏輯截取請求。EJB容器支持EJB訪問JMS、JAAS、JTA、JavaMail、JAXP、JDBC和連接器(Connector)。

Web容器

Web容器截取通過HTTP、FTP、SMTP或其他協(xié)議發(fā)送的請求。Web應(yīng)用容器為Servlet和JSP頁面提供的資源與EJB容器提供的資源相同。

應(yīng)用客戶端容器

客戶端應(yīng)用是獨立的Java應(yīng)用,它們在遠程的獨立JVM上運行(與Web容器和EJB容器所運行的JVM不同)。應(yīng)用客戶端容器為這些應(yīng)用截取請求。

運行在應(yīng)用客戶端容器上的程序非常類似于帶有main()方法的Java程序,不過,程序不再由JVM控制,而是由一個容器(也就是應(yīng)用客戶端容器)控制。

在應(yīng)用客戶端容器內(nèi)運行的程序能夠訪問遠程應(yīng)用服務(wù)器上的JAXP、JDBC、JMS和JAAS資源。

Applet容器

Applet容器是一個特殊的容器,它為在瀏覽器內(nèi)運行的Java程序截取請求。Applet容器不提供任何對其他資源(比如JDBC或JMS)的訪問。在Applet容器內(nèi)運行的Applet必須自己直接向應(yīng)用服務(wù)器請求資源(而不是把請求發(fā)送給容器,然后由容器發(fā)送請求給應(yīng)用服務(wù)器)。

對于Applet如何與EJB容器進行通信,EJB規(guī)范沒有作出任何規(guī)定,但J2EE規(guī)范有這方面的規(guī)定。對于那些想要直接使用EJB的Applet,J2EE規(guī)范要求它們使用HTTP隧道。許多應(yīng)用服務(wù)器提供某種形式的HTTP隧道,支持Applet直接使用EJB。

可以封裝到J2EE EAR文件里面的組件與包含容器的組件之間不存在直接的關(guān)聯(lián)。J2EE沒有規(guī)定EAR文件至少必須包含哪些內(nèi)容,EAR文件可以由任意數(shù)量的以下組件構(gòu)成:

EJB應(yīng)用JAR文件

EJB應(yīng)用JAR文件包含一個或者多個EJB組件。

Web應(yīng)用WAR文件

一個WAR文件包含一個Web應(yīng)用。EAR文件可以包含多個Web應(yīng)用,EAR文件中的每個Web應(yīng)用必須有一個唯一的部署上下文。EAR文件的部署機制允許指定這類不同的上下文。

應(yīng)用客戶端JAR文件

應(yīng)用客戶端JAR文件包含一個準(zhǔn)備在應(yīng)用客戶端容器內(nèi)運行的獨立Java應(yīng)用,還包含一個專用的部署描述器,其構(gòu)成方式和EJB JAR文件的構(gòu)成方式相似。

應(yīng)用客戶端JAR文件除了包含運行獨立客戶程序所需要的類之外,還包含訪問JDBC、JMS、JAXP、JAAS和EJB客戶所需要的客戶端庫。

資源適配器RAR文件

資源適配器RAR文件包含了實現(xiàn)企業(yè)信息系統(tǒng)JCA(Java Connector Architecture)資源適配器所需要的Java類和本地庫。

資源適配器不在容器內(nèi)執(zhí)行。相反,它們應(yīng)該作為應(yīng)用服務(wù)器和外部企業(yè)信息系統(tǒng)之間的橋接軟件執(zhí)行。

這些組件都在J2EE EAR文件之外分別地開發(fā)和打包,且分別擁有自己的部署描述器。然后,J2EE EAR文件通過定制的部署描述器,把一個或者多個這種組件裝配成一個統(tǒng)一的包。

1.2 封裝和部署操作的任務(wù)

在EJB、Web應(yīng)用或其他組件的構(gòu)造、部署和使用過程中,不同的人擔(dān)負著不同的職責(zé)。J2EE規(guī)范為開發(fā)者在創(chuàng)建企業(yè)應(yīng)用過程中的職責(zé)定義了范圍廣泛的平臺角色(Platform Role)。盡管角色的數(shù)量眾多,但它們不外乎是一種為了更好地規(guī)劃和運行一個應(yīng)用而設(shè)計的邏輯劃分,單獨的個人、小組或組織很可能扮演多個角色。在構(gòu)造、部署使用EAR文件的過程中,常見的角色包括:

J2EE產(chǎn)品提供者

負責(zé)實現(xiàn)J2EE平臺,包括在規(guī)范中定義的所有J2EE API和其他功能。比如,J2EE應(yīng)用服務(wù)器的供應(yīng)商。

應(yīng)用組件提供者

負責(zé)提供J2EE組件,例如EJB應(yīng)用或Web應(yīng)用。J2EE規(guī)范中的許多角色都具有應(yīng)用組件提供者的特征,比如文檔編寫者、JSP頁面編寫者、資源適配器開發(fā)者等。

應(yīng)用組裝者

負責(zé)把一個或者多個J2EE組件打包成EAR文件,構(gòu)造出J2EE應(yīng)用。應(yīng)用組裝者還要負責(zé)創(chuàng)建J2EE應(yīng)用部署描述器,說明應(yīng)用依賴的各種外部資源,比如類庫、安全角色等。通常,應(yīng)用組裝者要用到J2EE產(chǎn)品提供者和工具提供者提供的工具。

工具提供者

提供自動化J2EE應(yīng)用創(chuàng)建、打包、部署過程的工具,例如為EAR文件自動生成部署描述器的工具,自動創(chuàng)建EAR文件的工具。

部署者

負責(zé)把Web應(yīng)用和EJB應(yīng)用部署到服務(wù)器環(huán)境上。部署者不負責(zé)部署資源適配器包和應(yīng)用客戶端包,但可能要負責(zé)為這些組件進行額外的配置。這些組件雖然被打包成為J2EE EAR文件的一部分,部署企業(yè)應(yīng)用時卻不必考慮。它們是J2EE應(yīng)用的一部分,但不必象Web應(yīng)用和EJB容器那樣經(jīng)過一個“激活”過程。資源適配器包是置入合法JCA實現(xiàn)的簡單庫,雖然它們被打包進J2EE EAR文件,但它們不在J2EE容器環(huán)境下運行。因此,由于資源適配器包不包含J2EE容器,它們的激活不需要J2EE部署者的特別干預(yù)。應(yīng)用客戶端程序在J2EE容器的環(huán)境下運行,但它們不部署到應(yīng)用服務(wù)器上?蛻舳顺绦颡毩⑦\行,部署者不負責(zé)為這些程序配置容器環(huán)境。

系統(tǒng)管理員

負責(zé)為應(yīng)用服務(wù)器和J2EE應(yīng)用配置網(wǎng)絡(luò)和運行環(huán)境,負責(zé)監(jiān)視和維護J2EE應(yīng)用的運行。

在本文的討論過程中,我們主要的角色是應(yīng)用組裝者和部署者。

1.3 不能封裝到EAR文件的組件

大多數(shù)基于Web的J2EE應(yīng)用只由Web和EJB應(yīng)用構(gòu)成,EAR文件能夠滿足封裝應(yīng)用的基本需求。然而,EAR文件缺乏封裝復(fù)雜J2EE應(yīng)用的能力,比如,J2EE經(jīng)常要用到下面這類組件,但它們無法在EAR文件中聲明:
JDBC DataSource對象。
JMS ConnectionFactory和Destination對象。
JMX(Java Management Extension)的MBean。

在應(yīng)用服務(wù)器之內(nèi)運行的一些JMS消費者,例如作為ServerSession一部分運行的MessageConsumer。

當(dāng)應(yīng)用被部署或卸載時觸發(fā)運行的一些類(這些類是供應(yīng)商提供的私有擴展,沒有在J2EE規(guī)范中定義,但供應(yīng)商一般都提供它們)。

當(dāng)前,這些組件必須由系統(tǒng)管理員通過專用管理接口手工配置和部署。隨著時間的推移,這些組件的應(yīng)用也將日益增加,為了支持應(yīng)用的整體移植性,讓EAR文件支持這些組件的封裝也變得日益重要。

二、類裝載模式

當(dāng)一個類被引用時,Java虛擬機(JVM)必須裝入被引用的類。JVM利用一個標(biāo)準(zhǔn)的類裝入機制把類裝入內(nèi)存,這個從源文件裝入Java類的機制稱為類裝載器。Java類可以從磁盤、網(wǎng)絡(luò)或其他媒體裝入,它們可以駐留在任何地方。多個類裝載器可以按照父-子關(guān)系鏈接在一起,形成一種層次結(jié)構(gòu)。由子類裝載器裝入的類能夠看到(能夠使用)由任意父類裝載器裝入的類;由父類裝載器裝入的類不能看到由任意子類裝載器裝入的類。類裝載器、EAR文件與應(yīng)用部署有著重要關(guān)系,因為應(yīng)用服務(wù)器可能采用專用的類裝載器部署應(yīng)用模塊。

如果在一個系統(tǒng)中,Web應(yīng)用需要訪問某個EJB,它就必須能夠裝入它所需要的那些類。由于這意味著不同模塊之間的依賴關(guān)系,為了解決依賴問題,應(yīng)用服務(wù)器必須為EAR類裝載器考慮不同的結(jié)構(gòu)方案。

獨立的應(yīng)用程序部署在它自己的類裝載器中。這意味著,如果分別地部署一個Web應(yīng)用和一個EJB應(yīng)用,每個應(yīng)用的類將分別裝入各自的、級別相同的類裝入器,Web應(yīng)用內(nèi)的類不能看到另一個類裝載器裝入的類。如果Web應(yīng)用想要使用那些分開部署的EJB,就會出現(xiàn)問題。

在EAR文件出現(xiàn)之前,許多開發(fā)者先部署EJB,然后以Web應(yīng)用WEB-INF\lib目錄一部分的形式,再次封裝同一EJB JAR文件。這樣,同一類文件必須放入兩個不同的地方,才能讓應(yīng)用正常地運行。顯然,這是一種應(yīng)當(dāng)避免的情形。EAR文件的引入就是為了解決這個問題。EAR文件不僅是一種方便的封裝格式,而且它還提供了一種特殊的類裝載模式,允許EAR文件內(nèi)的應(yīng)用訪問其他應(yīng)用的類。

J2EE 1.3規(guī)范沒有具體規(guī)定EAR類裝載器應(yīng)該如何運作。在決定類裝入方式時,應(yīng)用服務(wù)器供應(yīng)商有著很大的自由。實現(xiàn)EAR類裝載器之前,供應(yīng)商必須決定:

EAR文件中所有應(yīng)用的所有類由單一的類裝載器裝入,還是不同應(yīng)用的文件由不同的類裝載器裝入?

在EAR文件中的不同應(yīng)用之間,是否存在類裝載器的父-子關(guān)系?例如,如果兩個EJB應(yīng)用依賴于log4j.jar,那么,是否應(yīng)該由父類裝載器裝入log4j.jar,由子類裝載器裝入兩個EJB應(yīng)用,從而維持適當(dāng)?shù)目梢娦躁P(guān)系?

如果類裝載器之間存在層次關(guān)系,那么這種層次關(guān)系允許擴展到什么程度?

多個EJB之間存在固有的關(guān)系,但Web應(yīng)用沒有。那么,EJB應(yīng)用的裝載方式是否應(yīng)該和Web應(yīng)用的不同,以便保持Web應(yīng)用的完整性?

2.1 在EJB 2.0之前

在EJB 2.0 Public Final Draft 2之前,供應(yīng)商在選擇類裝載模式方面有著很大的自由。如果JSP頁面和Servlet要使用某個EJB,那么它們只需能夠裝入EJB的Home接口、遠程接口、公共類和Stub類。這里所謂的公共類包括異常類、參數(shù)類等,它們應(yīng)該放入一個依賴JAR文件,作為一個有著依賴關(guān)系的包裝入。在這種模式下,供應(yīng)商必須為依賴于EJB的Web應(yīng)用選擇一種裝入Home接口、遠程接口和Stub類的方式。

下面是這種類裝載模式的一個簡單實現(xiàn)(客戶端應(yīng)用在另一個虛擬機之內(nèi)運行,與所有其他組件隔離,因此下面的模型不包含客戶端應(yīng)用的類裝入過程。):

在這個模型中,每一個EAR應(yīng)用將由一個定制的EAR類裝載器實例裝入,EJB應(yīng)用和Web應(yīng)用都由EAR類裝載器的定制子類裝載器裝入。在EAR文件中,所有準(zhǔn)備給一個以上應(yīng)用共享的類都由EAR類裝載器裝入,包括所有公用依賴庫和資源適配器包。如果一個類由EAR類裝載器裝入,它將自動地可供所有由子類裝載器裝入的類使用。

所有EJB應(yīng)用都由單一的EJB類裝載器裝入,這個EJB類裝載器是EAR類裝載器的子類裝載器。即使存在多個不同的EJB JAR文件,它們也都由同一類裝載器裝入。這一機制有利于同一JVM之內(nèi)不同應(yīng)用之間進行的EJB到EJB的調(diào)用。

每一個Web應(yīng)用都在不同的類裝載器中裝入,保持類之間的隔離。這是因為,如果每一個Web應(yīng)用有一個名為index.jsp的文件,則從該JSP頁面生成的Servlet會有同樣的類名字。由于每一個Web應(yīng)用應(yīng)該能夠裝入該Servlet的自己的版本,因此所有Web應(yīng)用必須在各自的類裝載器中隔離起來。

Web應(yīng)用要使用在同一EAR文件內(nèi)部署的EJB,必須能夠看到這些EJB的外部接口和Stub實現(xiàn)類。由于EJB和Web應(yīng)用的類裝載器屬于平等的關(guān)系(不是父-子關(guān)系),Web應(yīng)用不能直接看到必需的類文件。然而,Web應(yīng)用類裝載器和EJB應(yīng)用類裝載器有著相同的父類裝載器。為了讓W(xué)eb應(yīng)用能夠使用EJB的類文件,EJB類裝載器獲取各個EJB的公用接口和它們的Stub實現(xiàn)文件,然后把它們“導(dǎo)出”給EAR類裝載器,在EAR類裝載器中它們可以被EAR中的所有應(yīng)用訪問。公用接口和Stub實現(xiàn)文件就是客戶程序調(diào)用EJB時要用到的類。這樣,Web應(yīng)用就能夠裝入使用所有EJB時需要用到的類。

依賴工具庫可能在不同位置裝入,具體由指定這些庫的位置決定。如果一個Web應(yīng)用在它的WEB-INF\lib目錄下列出了一個依賴庫,則該庫只和這個Web應(yīng)用有關(guān),其他應(yīng)用無需訪問該庫的內(nèi)容,因此該庫不必由EAR類裝載器裝入。在這種情況下,Web應(yīng)用類裝載器將裝入該庫的JAR文件。其他Web應(yīng)用如果也要使用該庫,則必須在它自己的WEB-INF\lib目錄下提供。

如果依賴庫由EJB和Web應(yīng)用共享,則它必須由EAR類裝載器裝入。EAR類裝載器將裝入所有聲明為EJB所依賴的庫,使得依賴庫中的類具有合適的可見性。這就允許EJB開發(fā)者把所有公用的異常類、Web應(yīng)用可見的定制輸入?yún)?shù)類、EJB封裝到一個依賴庫里面。這個庫常常稱作common.jar,但并非一定得如此命名。

與EJB和Web應(yīng)用一起在EAR文件內(nèi)封裝的資源適配器包將自動由EAR類裝入器裝入。

2.2 在EJB 2.0之后

EJB 2.0規(guī)范引入了本地引用這一概念,它允許通過“傳遞引用”(而不是“傳遞值”)的方式訪問并存的客戶程序和EJB組件。本地引用這一概念使EAR類裝載問題發(fā)生了值得注意的變化。

當(dāng)EJB客戶程序通過“傳遞引用”方式執(zhí)行調(diào)用時,僅僅能夠訪問EJB的公用接口和Stub實現(xiàn)類是不夠的?蛻舫绦虮仨殦碛幸粋EJB容器實現(xiàn)類的直接引用。在本地引用方式下,EJB的客戶程序需要比以前更多的信息,這意味著在EJB 2.0之前使用的類裝載模式已不再有效。為解決這個問題,EJB客戶程序的類裝載器必須是EJB類裝載器的子孫,如下圖所示:

在這個模型中,Web應(yīng)用類裝載器是EJB類裝載器的子孫。這使得所有Web應(yīng)用能夠訪問它們作為EJB客戶程序所需要的文件。不過,為實現(xiàn)隔離,每一個Web應(yīng)用仍在一個定制的類裝載器中裝入。從整體結(jié)構(gòu)來看,新的模型更簡潔、更容易理解,它不再要求EJB類裝載器把任何文件導(dǎo)出給EAR類裝載器。

J2EE規(guī)范沒有明確規(guī)定Web應(yīng)用的依賴庫應(yīng)該如何裝載。如果一個工具類庫通過WEB-INF\lib指定,很顯然它應(yīng)該保持隔離,只能由Web應(yīng)用的類裝載器裝入它;然而,如果通過其他方式指定了一個工具類是Web應(yīng)用的依賴庫,它應(yīng)該由Web應(yīng)用的類裝載器裝入,還是應(yīng)該導(dǎo)出給EAR類裝載器?J2EE沒有對這一點作出具體規(guī)定。

對于被指定為Web應(yīng)用依賴庫的工具類庫,Silverstream應(yīng)用服務(wù)器和J2EE參考實現(xiàn)在EAR類裝載器級裝入它們,WeLogic Server 6.0在Web應(yīng)用類裝載器中裝入它們。但是,WebLogic Server 6.1改變了原來的辦法,支持在EAR級別上裝入Web應(yīng)用依賴庫。這種改變是有意義的,因為Web應(yīng)用的隔離總是可以通過把工具類庫放入WEB-INF\lib目錄實現(xiàn)。

在下一篇文章中,我們將從實踐的角度了解J2EE應(yīng)用的封裝和部署過程。