J2EE部署
J2EE的部署就是將應用構件按照一定的格式打包並放置在應用服務器的容器內,在部署時,J2EE提供的部署服務允許對應用構件進行設置;在J2EE構件被安裝在容器內時,它們一般是根據功能被分成若干個模塊,每個模塊都有一個部署描述文件(deploy descriptor)用於告訴J2EE容器如何進行部署;這個描述文件是一個基於XML的文本文件,部署描述文件包含許多與應用構件和J2EE平台服務有關的元素,譬如構件如何使用事務和安全服務等等。
一個J2EE程序包括一個或多個J2EE模塊和一個J2EE應用部署描述文件(不同於模塊的部署描述文件),該應用部署描述文件告訴J2EE應用服務器所需要部署的程序模塊和如何對這些模塊進行設置;一個J2EE程序就是一個企業檔案文件(EAR),EAR文件采用壓縮文件格式(像常用的zip文件),一個EAR文件包括一個或多個Java檔案文件(JAR)以及零個或多個資源檔案文件(RAR)。
J2EE有四種模塊,每種模塊對應一類構件。EJB模塊包含EJB的類文件EJB的部署描述文件。EJB模塊被打包成以.jar為擴展名的JAR文件;Web模塊包含JSP文件、為servlets程序編譯後的類文件、GIF和HTML文件以及Web部署描述文件,Web 模塊被打包成以.war為擴展名的WAR文件;其實WAR文件格式和JAR基本相同,可以認為WAR文件是特殊的JAR文件;資源適配器模塊(resource adapter)包含所有Java接口、類和其他文件,以及資源適配器的部署描述文件。這些類用來實施由企業信息相同EIS的連接。資源適配器模塊被打包成以.rar為擴展名的JAR文件;應用客戶模塊包含客戶程序的類文件和一個應用客戶部署描述文件,應用客戶模塊用JAR文件格式。
在上述每種類型的模塊中,每個部署單元都具有相應組件描述定義的組件結構。例如,Web模塊部署單位被稱為Web檔案(Web archive),它具有一個WEB-INF目錄以包含所有支持文件。一個或更多J2EE平台模塊可以組成一個J2EE應用程序,它包含它自己類型的部署單位;除組件和資源之外,各個部署單位包含一個部署描述文件,它是一個指定各組件與其環境之間的關系的XML文件。部署描述文件包含以下兩種信息:
(1)結構信息:它主要描述包含在部署單位中的組件信息,包括它們之間的關系和依賴性。通常這類信息包括ejb home和遠程接口及實現類、實體bean主鍵類、持續性機制及環境聲明變量和資源需求;一個組建容器將會使用結構信息來實時地管理組件實例。
(2)集成信息:這是一種可選擇的信息,描述了一個部署單位如何與其他部署單位集成並制造出新的組件,這類信息通常包括ejb關系名、描述符、安全角色信息、方法許可和環境變量值。
1、部署描述文件
部署描述文件(deployment descriptors)描述部署單位內容並相對於應用環境配置組件和應用程序。同時對它們與組件之間的關系做出了一定的處理,從而可以在無需編程的情況下對這些關系加以管理。部署工具通常會自動生成部署描述文件,所以開發人員不必直接編輯和管理它們。
通常部署描述文件有四種類型,每種對應於一個類型部署單位:
1) EJB部署描述文件;
2) Web層部署描述文件;
3) 應用客戶部署描述文件;
4) 資源適配器部署描述文件。
各種部署描述文件的定義都可以在相應的XML文檔類型定義(document type definition)中找到。部署描述文件包含由組件容器使用的信息及組件通過JNDI訪問的信息。
有關EJB部署、應用客戶部署及資源適配器部署請讀者參考有關J2EE資料,在此就不多說了,下面我們討論一下Web層部署內容。
2、Web程序部署
Web程序的部署主要包括將Web程序以標准格式打包和將Web程序放入Web服務器中運行兩步。Web程序的部署描述文件(deployment descriptor)建立了Web程序和Web程序服務器之間的信息交流。一個部署描述文件采用符合特定標准的格式來描述一個Web程序內的構件(如servlet,filter,listener,JSP等)和使用方式(如安全機制、錯誤處理方法等)。當Web程序服務器啟動並加載一個Web程序時,它會根據其部署描述文件設置其運行狀態並初始化Web構件。
1)web.xml文件的格式
由於Web程序開發中各種人員有不同分工,而Web程序的部署描述文件是程序構件提供者、程序組裝者和程序部署者之間的溝通機制;Servlet 2.4之前的版本規定了在Web服務器中使用DTD格式的web.xml,而Servlet 2.4將依照XML schema格式定義web.xml;實際上這兩種格式的web.xml只是在頭部有區別,其內容都是描述Web程序的部署信息。在web.xml中出現的部署元素主要包含以下信息:
a、ServletContext的初始化變量(Init Parameters);
b、交互會話(Session)的設置;
c、Servlet的聲明定義;
d、Servlet和網址URL的映射(Mapping);
e、應用程序生命周期的監聽器(Application Lifecycle Listener);
f、過濾器聲明;
g、過濾器和網址URL或Servlet/JSP的映射;
h、MIME類型;
i、歡迎文件(Welcome File);
j、錯誤網頁(Error Pages);
k、安全設置信息;
l、taglib配置;
m、JNDI對象(env-entry,ejb-ref,ejb-local-ref,resource-ref,resource-env-ref)。
其中taglib配置與JNDI對象這兩項是支持J2EE的Web服務器必須要求的。對於不支持J2EE的servlet/JSP服務器,不需要這兩項;在web.xml中的元素需要按照規定的大小寫和順序出現。
2)Web程序結構和部署方式
在設置了部署描述文件後,需要對Web程序進行編譯和打包,一個Web程序需要依照標准的目錄和文件格式組織其內容。例如在Tomcat 5.0中的目錄和文件格式,其中WEB-INF目錄中有web.xml部署描述文件和包括該Web程序Java類的classes目錄。在Web服務器中部署Web程序的方式有兩種:一種是直接將依照標准格式的Web程序的整個目錄編譯後放入Web服務器的webapps目錄,這樣Web服務器啟動時會自動加載Web程序;另一種是將Web程序編譯並打包生成一個war文件,然後放入Web服務器的webapps目錄。Web服務器可以選擇不需解壓直接加載這個Web程序的war文件,或者將這個war文件解壓到一個目錄後加載。在/conf/server.xml中可以設定選擇何種加載方式。如果<Host>標記的unpackWARs="flase",表明Web服務器不需要將war文件解壓成目錄;如果unpackWARs="true",表明Web服務器會在第一次加載Web程序時將該war文件解壓成一個目錄。
<Host name="localhost" appBase="webapps" debug="0" unpackWARs="false">
第二種方式的優點是增強了Web程序的可移植性,一個war文件可以在不同的符合標准的Web服務器中運行而且文件比較小;當需要將Web程序給予其他人員時,給對方一個war文件當然比給一個目錄方便;但是生成war文件需要將一個Web程序的目錄進行壓縮,在調試過程中,如果編程者需要經常對程序的某些部分進行改動,使用第一種方式就比較方便。每次需要改動時就在webapps的Web程序目錄中用改動的文件替代舊的文件,而不用每次打包生成war文件。
3)使用編程工具編譯和打包
一個war文件就是有特定格式(如WEB-INF目錄)的jar文件,它將一個Web程序的所有內容進行壓縮。在生成war文件之前,所有WEB-INF/classes目錄下面的servlet,filter等類需要首先被成功編譯,最基本的方法是直接使用javac命令編譯所有的類。需要注意的是classpath環境變量要包括最新的servlet和JSP的jar,為了簡單高效地編譯Web程序並進行打包,可以使用提供Web程序管理功能的開發工具(IDE),比如Sun的Forte for Java IDE提供非常方便的Web程序開發環境,它可以統一管理程序的classpath和Java文檔,用來編寫大型的J2EE程序非常方便。可以使用Web服務器的deploytool打包,比如sun的JWSDP1.0就提供了一個圖形界面的deploytool;也可以使用Apache軟件組織開發的Ant(螞蟻)工具進行編譯和打包,完成Web程序部署。