J2EE應(yīng)用部署(二):
發(fā)表時(shí)間:2024-02-06 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]一、配置J2EE包 1.1 企業(yè)應(yīng)用的開(kāi)發(fā)過(guò)程 1.2 J2EE應(yīng)用包的結(jié)構(gòu) 1.3 EAR部署描述器 二、一個(gè)簡(jiǎn)單的實(shí)例 2.1 組件 2.2 裝配應(yīng)用 2.3 部署和運(yùn)行應(yīng)用 三、可選的應(yīng)用部署描述器標(biāo)記 =...
一、配置J2EE包
1.1 企業(yè)應(yīng)用的開(kāi)發(fā)過(guò)程
1.2 J2EE應(yīng)用包的結(jié)構(gòu)
1.3 EAR部署描述器
二、一個(gè)簡(jiǎn)單的實(shí)例
2.1 組件
2.2 裝配應(yīng)用
2.3 部署和運(yùn)行應(yīng)用
三、可選的應(yīng)用部署描述器標(biāo)記
===================================
正文:
===================================
一、配置J2EE包
在上一篇文章中,我們了解了J2EE應(yīng)用封裝和部署的一些基本知識(shí),包括類(lèi)裝載器的不同角色和行為。接下來(lái)就可以配置和部署企業(yè)應(yīng)用。為此,我們必須了解創(chuàng)建EAR文件的過(guò)程,以及應(yīng)用部署描述器的內(nèi)容。
1.1 企業(yè)應(yīng)用的開(kāi)發(fā)過(guò)程
構(gòu)造一個(gè)企業(yè)應(yīng)用的過(guò)程可以歸納為:
構(gòu)造各個(gè)組件,包括EJB、JSP頁(yè)面、Servlet和資源適配器等。
把這些組件打包成JAR文件格式的J2EE模塊,同時(shí)提供J2EE模塊部署描述器。J2EE模塊是一種具有相同類(lèi)型的一個(gè)或者多個(gè)J2EE組件的集合,也就是說(shuō),一個(gè)EJB模塊可以包含一個(gè)以上的EJB,一個(gè)Web應(yīng)用模塊可以包含多個(gè)JSP頁(yè)面和Servlet,一個(gè)資源適配器包可以包含多個(gè)資源適配器。
結(jié)合一個(gè)或者多個(gè)J2EE模塊創(chuàng)建EAR文件,同時(shí)提供企業(yè)應(yīng)用部署描述器,構(gòu)造出J2EE應(yīng)用。最簡(jiǎn)單的J2EE應(yīng)用只包含一個(gè)J2EE模塊,稍微復(fù)雜一點(diǎn)的J2EE應(yīng)用可以由多個(gè)J2EE模塊構(gòu)成,更復(fù)雜的J2EE應(yīng)用可以包含多個(gè)J2EE模塊、模塊里面包含的類(lèi)所用到的依賴(lài)庫(kù)。J2EE應(yīng)用還可以包含描述部署過(guò)程的幫助文件和其他文檔。
把J2EE應(yīng)用部署到J2EE平臺(tái)上。安裝J2EE應(yīng)用,然后把它與應(yīng)用服務(wù)器提供的基礎(chǔ)設(shè)施整合。在J2EE應(yīng)用部署過(guò)程中,每一個(gè)J2EE模塊按照該類(lèi)模塊的部署要求分別部署,每一個(gè)組件被部署到適合該組件類(lèi)型的合適容器。例如,假設(shè)有一個(gè)my.ear文件,它包含my.jar和my.war。部署應(yīng)用時(shí),應(yīng)用服務(wù)器的部署工具將把my.ear文件拷貝到應(yīng)用服務(wù)器;接著,應(yīng)用服務(wù)器的部署機(jī)制將提取出my.jar和my.war模塊,按照當(dāng)前平臺(tái)的類(lèi)裝載要求分別部署這兩個(gè)模塊。如果這兩個(gè)模塊都部署成功,則整個(gè)J2EE應(yīng)用部署成功。
J2EE企業(yè)應(yīng)用開(kāi)發(fā)和部署過(guò)程可以圖示如下:
組件被封裝成J2EE模塊時(shí)帶有一個(gè)部署描述器,J2EE模塊可以通過(guò)部署工具創(chuàng)建。部署工具還可以用來(lái)部署和“反部署”獨(dú)立的J2EE模塊,用來(lái)把一個(gè)或者多個(gè)J2EE模塊和另外的部署描述器封裝成J2EE應(yīng)用,用來(lái)把額外的內(nèi)容加入J2EE應(yīng)用或從J2EE應(yīng)用刪除某些內(nèi)容,或者把整個(gè)應(yīng)用部署到應(yīng)用服務(wù)器上。
1.2 J2EE應(yīng)用包的結(jié)構(gòu)
J2EE企業(yè)應(yīng)用包的結(jié)構(gòu)很簡(jiǎn)單,它由一個(gè)或多個(gè)J2EE模塊以及一個(gè)META-INF\目錄下名為application.xml的部署描述器構(gòu)成。文件用JAR格式打包,存儲(chǔ)在擴(kuò)展名為.ear的文件中。EAR文件可以包含依賴(lài)庫(kù),但這是可選的。EAR文件的一般結(jié)構(gòu)是:
EJB .jar文件 Web應(yīng)用.war文件 資源適配器.rar文件 應(yīng)用客戶(hù)端.jar文件 依賴(lài)庫(kù).jar文件 META-INF\ application.xml
下面是一個(gè)EAR文件的例子,它包含一個(gè)EJB模塊、一個(gè)Web應(yīng)用模塊,不包含依賴(lài)庫(kù):
MyFirstEJB.jar MyFirstWeb.war META-INF\ application.xml
保存在EAR文件中的J2EE模塊不一定要在根目錄之下。例如,假設(shè)一個(gè)EAR文件包含一個(gè)EJB模塊、一個(gè)資源適配器包,它的結(jié)構(gòu)可以如下:
ejbs\ MySecondEJB.jar resources\ MyLegacyAdapter.rar META-INF\ application.xml
最后,下面是一個(gè)包含許多組件和依賴(lài)庫(kù)的EAR文件:
ejbs\ MyThirdEJB.jar MyFourthEJB.jar resources\ MyLegacyAdapter.rar web\ MyWebApp1.war MyWebApp2.war lib\ Myxmlx.jar Mycommon.jar META-INF\ application.xml
EAR文件可以用部署工具創(chuàng)建,或者也可以改用JDK提供的jar工具創(chuàng)建。創(chuàng)建步驟為:
創(chuàng)建一個(gè)用來(lái)容納EAR文件內(nèi)容的臨時(shí)目錄。
把所有J2EE模塊放入臨時(shí)目錄,創(chuàng)建META-INF\目錄。
在META-INF\目錄下創(chuàng)建application.xml部署描述器。
完成上述步驟之后,進(jìn)入臨時(shí)目錄,運(yùn)行jar工具創(chuàng)建EAR文件。
下面是一個(gè)運(yùn)行jar工具的例子,它對(duì)前面例子進(jìn)行打包:
jar cvf MyApplication.ear ejbs resources web lib META-INF
創(chuàng)建好EAR文件之后,我們就可以把J2EE應(yīng)用部署到應(yīng)用服務(wù)器上。
1.3 EAR部署描述器
理想情況下,我們用圖形界面的工具編寫(xiě)application.xml文件。然而,有時(shí)我們必須手工構(gòu)造或維護(hù)application.xml文件,因此理解application.xml文件用到的標(biāo)記很重要。
application.xml部署描述器并不復(fù)雜,不需要很多標(biāo)記就可以構(gòu)造出一個(gè)合法的描述器。部署描述器的DTD定義的標(biāo)記包括:
所有合法的J2EE應(yīng)用描述器必須包含如下DOCTYPE聲明:
<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application
1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">
配置一個(gè)簡(jiǎn)單的application.xml部署描述器只需如下幾步:
用標(biāo)記聲明一個(gè)企業(yè)應(yīng)用。標(biāo)記可以包含、和標(biāo)記,供部署工具提供有關(guān)應(yīng)用的描述信息使用。這些標(biāo)記的內(nèi)容和EJB、Web應(yīng)用、資源適配器部署描述器內(nèi)的同一標(biāo)記的內(nèi)容相同。
企業(yè)應(yīng)用內(nèi)的每一個(gè)模塊必須有一個(gè)相應(yīng)的標(biāo)記描述模塊。EJB用標(biāo)記描述,Web應(yīng)用用標(biāo)記描述,資源適配器用標(biāo)記描述,應(yīng)用客戶(hù)端程序用標(biāo)記描述。除了標(biāo)記之外,其他標(biāo)記的內(nèi)容都是指定EAR文件內(nèi)包含J2EE模塊的文件的相對(duì)URI,該URI必須相對(duì)于EAR文件的根。
如果企業(yè)應(yīng)用包含一個(gè)Web應(yīng)用J2EE模塊,則必須提供一個(gè)標(biāo)記和一個(gè)標(biāo)記。標(biāo)記是一個(gè)相對(duì)URI,指定EAR文件內(nèi)包含J2EE模塊的文件。這個(gè)URI和、、標(biāo)記的URI同屬一類(lèi)。標(biāo)記指定Web應(yīng)用將在其下運(yùn)行的上下文的名字。所有針對(duì)該Web應(yīng)用內(nèi)JSP頁(yè)面和Servlet的請(qǐng)求都必須加上該上下文名字作為前綴。例如,如果部署Web應(yīng)用時(shí)指定了:
<context-root>web1</context-root>
則所有對(duì)JSP頁(yè)面和Servlet的請(qǐng)求必須是如下形式:
http://主機(jī):端口/web1/......
在EAR文件內(nèi)封裝的每一個(gè)Web應(yīng)用都要有一個(gè)唯一的值,任何兩個(gè)Web應(yīng)用不能有相同的值。如果EAR文件只包含一個(gè)Web應(yīng)用,的值可以是空字符串。
二、一個(gè)簡(jiǎn)單的實(shí)例
在大多數(shù)使用EAR文件的情形中,企業(yè)應(yīng)用包含一個(gè)EJB模塊、一個(gè)Web應(yīng)用模塊,Web應(yīng)用要用到EJB模塊里面的EJB組件。下面的例子就屬于這種情況,EJB和Web應(yīng)用不需要任何依賴(lài)庫(kù)。下面我們來(lái)看看構(gòu)造這個(gè)例子的具體過(guò)程。
2.1 組件
在這個(gè)例子中,一個(gè)Servlet在無(wú)狀態(tài)會(huì)話EJB的遠(yuǎn)程接口上調(diào)用invoke()方法,Servlet和EJB輸出一些文字信息表明程序已經(jīng)成功執(zhí)行。如果控制臺(tái)出現(xiàn)異常報(bào)告,它很可能意味著組件封裝存在問(wèn)題。本例的所有EJB源文件都屬于test包,Servlet屬于未命名的包。本例用到的Java文件包括:
MyEnterpriseServlet.java:Servlet的實(shí)現(xiàn)類(lèi),執(zhí)行對(duì)EJB的調(diào)用
MyEnterprise.java:EJB的遠(yuǎn)程接口。
MyEnterpriseHome.java:EJB的Home接口。
MyEnterpriseBean.java::EJB的實(shí)現(xiàn)類(lèi)。
MyEnterpriseBean.java的實(shí)現(xiàn)代碼是:
quote:
--------------------------------------------------------------------------------
package test;
import javax.ejb.*;
public class MyEnterpriseBean implements SessionBean {
private InitialContext ctx;
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext c) {}
public void invoke() {
System.out.println("正在執(zhí)行EJB.");
}
}
MyEnterpriseServlet.java Servlet的實(shí)現(xiàn)代碼是:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.naming.*;
public class MyEnterpriseServlet extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException{
res.setContentType("text/html;charset=GB2312");
PrintWriter out = res.getWriter();
try {
System.out.println("正在服務(wù)器上運(yùn)行Servlet");
InitialContext ctx = new InitialContext();
test.MyEnterpriseHome eHome = (test.MyEnterpriseHome)
ctx.lookup("MyEnterpriseEJB");
test.MyEnterprise e = eHome.create();
e.invoke();
} catch(Exception e) {
out.println("異常: " + e);
System.out.println("異常: " + e);
}
out.println("<html><head><title>測(cè)試</title></head>");
out.println("<body>");
out.println("<h1>檢查控制臺(tái)確信EJB已經(jīng)被調(diào)用</h1>");
out.println("</body></html>");
}
}
--------------------------------------------------------------------------------
編寫(xiě)好EJB和相關(guān)的部署描述器(此處不列出)之后,接下來(lái)要把EJB封裝成MyEnterpriseBean.jar文件。在JNDI名稱(chēng)空間配置中,EJB綁定到MyEnterpriseEJB。編寫(xiě)好Servlet代碼和相關(guān)的部署描述器(此處也不列出)之后,Servlet應(yīng)該封裝成MyWebApp.war文件。
2.2 裝配應(yīng)用
構(gòu)造好各個(gè)組件之后,接下來(lái)應(yīng)該編寫(xiě)企業(yè)應(yīng)用部署描述器。我們必須把EJB和Web應(yīng)用注冊(cè)為企業(yè)應(yīng)用的模塊,還要讓W(xué)eb應(yīng)用的組件在/web/上下文之下執(zhí)行。這樣,本例的application.xml文件應(yīng)該為:
quote:
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application
1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'>
<application>
<display-name>Enterprise Application</display-name>
<module>
<ejb>MyEnterpriseBean.jar
</module>
<module>
<web>
<web-uri>MyWebApp.war</web-uri>
<context-root>web</context-root>
</web>
</module>
</application>
--------------------------------------------------------------------------------
編寫(xiě)好application.xml部署描述器之后,企業(yè)應(yīng)用的目錄將包括:
MyEnterpriseBean.jar MyWebApp.war META-INF\ application.xml
用jar工具創(chuàng)建名為MyEnterprise.ear的EAR文件,控制臺(tái)命令如下:
jar cvf MyEnterprise.ear MyEnterpriseBean.jar MyWebApp.war META-INF
值得一提的是,如果使用J2EE參考實(shí)現(xiàn)(Reference Implementation)提供的deploytool,我們不必手工編寫(xiě)ejb-jar.xml、web.xml和application.xml部署描述器,這些文件由deploytool自動(dòng)生成。在本例的企業(yè)應(yīng)用中,application.xml就是自動(dòng)生成的。
2.3 部署和運(yùn)行應(yīng)用
構(gòu)造好EAR文件之后,接下來(lái)該部署它了。記住,具體的部署操作和平臺(tái)有關(guān),不同的供應(yīng)商提供了不同的部署工具。例如,J2EE的deploytool能夠把企業(yè)應(yīng)用部署到J2EE參考實(shí)現(xiàn)上。
成功地部署好企業(yè)應(yīng)用之后,接下來(lái)就可以調(diào)用Servlet了。由于該企業(yè)應(yīng)用上下文的根是/web,Servlet作為它的一部分調(diào)用。為此,我們?cè)跒g覽器中輸入的地址應(yīng)該是如下形式:
http://主機(jī):端口/web/myenterpriseservlet/
三、可選的應(yīng)用部署描述器標(biāo)記
在某些情形下,有兩個(gè)可選的部署描述器標(biāo)記可供使用,它們是和標(biāo)記。
是的子標(biāo)記,它的值是一個(gè)為模塊提供的從EAR文件的根開(kāi)始的URI,指向另一個(gè)部署描述器文件。這個(gè)文件的命名不必和它在J2EE模塊里面時(shí)一樣。例如,所有EJB模塊的部署描述器必須命名為ejb-jar.xml,但如果標(biāo)記的值指向一個(gè)EJB模塊的可選部署描述器,文件就可以取ejb-jar.xml以外的名字。
標(biāo)記中指定的部署描述器文件將覆蓋J2EE模塊里面包含的描述器,。標(biāo)記可以用來(lái)引用部署描述器的外部版本,當(dāng)部署者想要使用的部署描述器與包含在EJB、Web應(yīng)用、資源適配器或者應(yīng)用客戶(hù)端模塊內(nèi)的描述器不同時(shí),就可以使用這個(gè)標(biāo)記。如果不指定標(biāo)記的值,部署工具將使用EAR文件里面JAR、WAR或RAR文件中提供的值。例如,要為Web應(yīng)用指定一個(gè)外部的可選部署描述器,假設(shè)該描述器在EAR文件的根下面,我們指定:
quote:
--------------------------------------------------------------------------------
<module>
<web>
<web-uri>web.war</web-uri>
<context-root>web</context-root>
</web>
<alt-dd>external-web.xml</alt-dd>
</module>
--------------------------------------------------------------------------------
標(biāo)記用來(lái)指定應(yīng)用級(jí)的安全角色,這個(gè)安全角色將用于EAR文件包含的所有J2EE模塊。如果EAR文件包含多個(gè)EJB模塊或多個(gè)Web應(yīng)用模塊,這些模塊都可以有自己的安全角色定義。部署者的責(zé)任之一是確保所有J2EE模塊中包含的所有安全角色都有一個(gè)唯一的名字,而且對(duì)于應(yīng)用整體來(lái)說(shuō)具有實(shí)際意義。安全角色可以從J2EE模塊級(jí)“拉出”到企業(yè)應(yīng)用級(jí),加入到標(biāo)記。也就是說(shuō),如果某個(gè)J2EE模塊中存在一個(gè)重復(fù)的安全角色值,該值可以刪除,只需在企業(yè)應(yīng)用級(jí)提供即可。
標(biāo)記需要一個(gè)子標(biāo)記指定安全角色的名稱(chēng)。下面是一個(gè)配置標(biāo)記的例子:
quote:
--------------------------------------------------------------------------------
<security-role>
<description>
Security role of administrator
</description>
<role-name>Administrator</role-name>
</security-role>