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

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

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

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

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

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

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

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

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

Web容器

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

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

客戶端應(yīng)用是獨(dú)立的Java應(yīng)用,它們?cè)谶h(yuǎn)程的獨(dú)立JVM上運(yùn)行(與Web容器和EJB容器所運(yùn)行的JVM不同)。應(yīng)用客戶端容器為這些應(yīng)用截取請(qǐng)求。

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

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

Applet容器

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

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

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

EJB應(yīng)用JAR文件

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

Web應(yīng)用WAR文件

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

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

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

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

資源適配器RAR文件

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

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

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

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

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

J2EE產(chǎn)品提供者

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

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

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

應(yīng)用組裝者

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

工具提供者

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

部署者

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

系統(tǒng)管理員

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

在本文的討論過(guò)程中,我們主要的角色是應(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)常要用到下面這類組件,但它們無(wú)法在EAR文件中聲明:
JDBC DataSource對(duì)象。
JMS ConnectionFactory和Destination對(duì)象。
JMX(Java Management Extension)的MBean。

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

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

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

二、類裝載模式

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

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

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

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

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

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

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

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

多個(gè)EJB之間存在固有的關(guān)系,但Web應(yīng)用沒(méi)有。那么,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頁(yè)面和Servlet要使用某個(gè)EJB,那么它們只需能夠裝入EJB的Home接口、遠(yuǎn)程接口、公共類和Stub類。這里所謂的公共類包括異常類、參數(shù)類等,它們應(yīng)該放入一個(gè)依賴JAR文件,作為一個(gè)有著依賴關(guān)系的包裝入。在這種模式下,供應(yīng)商必須為依賴于EJB的Web應(yīng)用選擇一種裝入Home接口、遠(yuǎn)程接口和Stub類的方式。

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

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

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

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

Web應(yīng)用要使用在同一EAR文件內(nèi)部署的EJB,必須能夠看到這些EJB的外部接口和Stub實(shí)現(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類裝載器獲取各個(gè)EJB的公用接口和它們的Stub實(shí)現(xiàn)文件,然后把它們“導(dǎo)出”給EAR類裝載器,在EAR類裝載器中它們可以被EAR中的所有應(yīng)用訪問(wèn)。公用接口和Stub實(shí)現(xiàn)文件就是客戶程序調(diào)用EJB時(shí)要用到的類。這樣,Web應(yīng)用就能夠裝入使用所有EJB時(shí)需要用到的類。

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

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

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

2.2 在EJB 2.0之后

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

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

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

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

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

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