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

J2EE應用部署(二):

[摘要]一、配置J2EE包 1.1 企業(yè)應用的開發(fā)過程 1.2 J2EE應用包的結(jié)構(gòu) 1.3 EAR部署描述器 二、一個簡單的實例 2.1 組件 2.2 裝配應用 2.3 部署和運行應用 三、可選的應用部署描述器標記 =...
一、配置J2EE包

1.1 企業(yè)應用的開發(fā)過程
1.2 J2EE應用包的結(jié)構(gòu)
1.3 EAR部署描述器

二、一個簡單的實例

2.1 組件
2.2 裝配應用
2.3 部署和運行應用

三、可選的應用部署描述器標記

===================================
正文:
===================================
一、配置J2EE包

在上一篇文章中,我們了解了J2EE應用封裝和部署的一些基本知識,包括類裝載器的不同角色和行為。接下來就可以配置和部署企業(yè)應用。為此,我們必須了解創(chuàng)建EAR文件的過程,以及應用部署描述器的內(nèi)容。

1.1 企業(yè)應用的開發(fā)過程

構(gòu)造一個企業(yè)應用的過程可以歸納為:

構(gòu)造各個組件,包括EJB、JSP頁面、Servlet和資源適配器等。

把這些組件打包成JAR文件格式的J2EE模塊,同時提供J2EE模塊部署描述器。J2EE模塊是一種具有相同類型的一個或者多個J2EE組件的集合,也就是說,一個EJB模塊可以包含一個以上的EJB,一個Web應用模塊可以包含多個JSP頁面和Servlet,一個資源適配器包可以包含多個資源適配器。

結(jié)合一個或者多個J2EE模塊創(chuàng)建EAR文件,同時提供企業(yè)應用部署描述器,構(gòu)造出J2EE應用。最簡單的J2EE應用只包含一個J2EE模塊,稍微復雜一點的J2EE應用可以由多個J2EE模塊構(gòu)成,更復雜的J2EE應用可以包含多個J2EE模塊、模塊里面包含的類所用到的依賴庫。J2EE應用還可以包含描述部署過程的幫助文件和其他文檔。

把J2EE應用部署到J2EE平臺上。安裝J2EE應用,然后把它與應用服務器提供的基礎設施整合。在J2EE應用部署過程中,每一個J2EE模塊按照該類模塊的部署要求分別部署,每一個組件被部署到適合該組件類型的合適容器。例如,假設有一個my.ear文件,它包含my.jar和my.war。部署應用時,應用服務器的部署工具將把my.ear文件拷貝到應用服務器;接著,應用服務器的部署機制將提取出my.jar和my.war模塊,按照當前平臺的類裝載要求分別部署這兩個模塊。如果這兩個模塊都部署成功,則整個J2EE應用部署成功。

J2EE企業(yè)應用開發(fā)和部署過程可以圖示如下:


組件被封裝成J2EE模塊時帶有一個部署描述器,J2EE模塊可以通過部署工具創(chuàng)建。部署工具還可以用來部署和“反部署”獨立的J2EE模塊,用來把一個或者多個J2EE模塊和另外的部署描述器封裝成J2EE應用,用來把額外的內(nèi)容加入J2EE應用或從J2EE應用刪除某些內(nèi)容,或者把整個應用部署到應用服務器上。

1.2 J2EE應用包的結(jié)構(gòu)

J2EE企業(yè)應用包的結(jié)構(gòu)很簡單,它由一個或多個J2EE模塊以及一個META-INF\目錄下名為application.xml的部署描述器構(gòu)成。文件用JAR格式打包,存儲在擴展名為.ear的文件中。EAR文件可以包含依賴庫,但這是可選的。EAR文件的一般結(jié)構(gòu)是:

EJB .jar文件 Web應用.war文件 資源適配器.rar文件 應用客戶端.jar文件 依賴庫.jar文件 META-INF\ application.xml

下面是一個EAR文件的例子,它包含一個EJB模塊、一個Web應用模塊,不包含依賴庫:
MyFirstEJB.jar MyFirstWeb.war META-INF\ application.xml

保存在EAR文件中的J2EE模塊不一定要在根目錄之下。例如,假設一個EAR文件包含一個EJB模塊、一個資源適配器包,它的結(jié)構(gòu)可以如下:
ejbs\ MySecondEJB.jar resources\ MyLegacyAdapter.rar META-INF\ application.xml

最后,下面是一個包含許多組件和依賴庫的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)建一個用來容納EAR文件內(nèi)容的臨時目錄。
把所有J2EE模塊放入臨時目錄,創(chuàng)建META-INF\目錄。
在META-INF\目錄下創(chuàng)建application.xml部署描述器。
完成上述步驟之后,進入臨時目錄,運行jar工具創(chuàng)建EAR文件。

下面是一個運行jar工具的例子,它對前面例子進行打包:
jar cvf MyApplication.ear ejbs resources web lib META-INF

創(chuàng)建好EAR文件之后,我們就可以把J2EE應用部署到應用服務器上。

1.3 EAR部署描述器

理想情況下,我們用圖形界面的工具編寫application.xml文件。然而,有時我們必須手工構(gòu)造或維護application.xml文件,因此理解application.xml文件用到的標記很重要。

application.xml部署描述器并不復雜,不需要很多標記就可以構(gòu)造出一個合法的描述器。部署描述器的DTD定義的標記包括:

所有合法的J2EE應用描述器必須包含如下DOCTYPE聲明:

<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application
1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">


配置一個簡單的application.xml部署描述器只需如下幾步:
用標記聲明一個企業(yè)應用。標記可以包含、和標記,供部署工具提供有關應用的描述信息使用。這些標記的內(nèi)容和EJB、Web應用、資源適配器部署描述器內(nèi)的同一標記的內(nèi)容相同。

企業(yè)應用內(nèi)的每一個模塊必須有一個相應的標記描述模塊。EJB用標記描述,Web應用用標記描述,資源適配器用標記描述,應用客戶端程序用標記描述。除了標記之外,其他標記的內(nèi)容都是指定EAR文件內(nèi)包含J2EE模塊的文件的相對URI,該URI必須相對于EAR文件的根。

如果企業(yè)應用包含一個Web應用J2EE模塊,則必須提供一個標記和一個標記。標記是一個相對URI,指定EAR文件內(nèi)包含J2EE模塊的文件。這個URI和、、標記的URI同屬一類。標記指定Web應用將在其下運行的上下文的名字。所有針對該Web應用內(nèi)JSP頁面和Servlet的請求都必須加上該上下文名字作為前綴。例如,如果部署Web應用時指定了:

<context-root>web1</context-root>

則所有對JSP頁面和Servlet的請求必須是如下形式:

http://主機:端口/web1/......

在EAR文件內(nèi)封裝的每一個Web應用都要有一個唯一的值,任何兩個Web應用不能有相同的值。如果EAR文件只包含一個Web應用,的值可以是空字符串。

二、一個簡單的實例

在大多數(shù)使用EAR文件的情形中,企業(yè)應用包含一個EJB模塊、一個Web應用模塊,Web應用要用到EJB模塊里面的EJB組件。下面的例子就屬于這種情況,EJB和Web應用不需要任何依賴庫。下面我們來看看構(gòu)造這個例子的具體過程。

2.1 組件

在這個例子中,一個Servlet在無狀態(tài)會話EJB的遠程接口上調(diào)用invoke()方法,Servlet和EJB輸出一些文字信息表明程序已經(jīng)成功執(zhí)行。如果控制臺出現(xiàn)異常報告,它很可能意味著組件封裝存在問題。本例的所有EJB源文件都屬于test包,Servlet屬于未命名的包。本例用到的Java文件包括:

MyEnterpriseServlet.java:Servlet的實現(xiàn)類,執(zhí)行對EJB的調(diào)用
MyEnterprise.java:EJB的遠程接口。
MyEnterpriseHome.java:EJB的Home接口。
MyEnterpriseBean.java::EJB的實現(xiàn)類。


MyEnterpriseBean.java的實現(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的實現(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("正在服務器上運行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>測試</title></head>");
out.println("<body>");
out.println("<h1>檢查控制臺確信EJB已經(jīng)被調(diào)用</h1>");
out.println("</body></html>");
}
}



--------------------------------------------------------------------------------



編寫好EJB和相關的部署描述器(此處不列出)之后,接下來要把EJB封裝成MyEnterpriseBean.jar文件。在JNDI名稱空間配置中,EJB綁定到MyEnterpriseEJB。編寫好Servlet代碼和相關的部署描述器(此處也不列出)之后,Servlet應該封裝成MyWebApp.war文件。

2.2 裝配應用

構(gòu)造好各個組件之后,接下來應該編寫企業(yè)應用部署描述器。我們必須把EJB和Web應用注冊為企業(yè)應用的模塊,還要讓Web應用的組件在/web/上下文之下執(zhí)行。這樣,本例的application.xml文件應該為:


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>


--------------------------------------------------------------------------------



編寫好application.xml部署描述器之后,企業(yè)應用的目錄將包括:
MyEnterpriseBean.jar MyWebApp.war META-INF\ application.xml
用jar工具創(chuàng)建名為MyEnterprise.ear的EAR文件,控制臺命令如下:

jar cvf MyEnterprise.ear MyEnterpriseBean.jar MyWebApp.war META-INF


值得一提的是,如果使用J2EE參考實現(xiàn)(Reference Implementation)提供的deploytool,我們不必手工編寫ejb-jar.xml、web.xml和application.xml部署描述器,這些文件由deploytool自動生成。在本例的企業(yè)應用中,application.xml就是自動生成的。

2.3 部署和運行應用

構(gòu)造好EAR文件之后,接下來該部署它了。記住,具體的部署操作和平臺有關,不同的供應商提供了不同的部署工具。例如,J2EE的deploytool能夠把企業(yè)應用部署到J2EE參考實現(xiàn)上。

成功地部署好企業(yè)應用之后,接下來就可以調(diào)用Servlet了。由于該企業(yè)應用上下文的根是/web,Servlet作為它的一部分調(diào)用。為此,我們在瀏覽器中輸入的地址應該是如下形式:

http://主機:端口/web/myenterpriseservlet/


三、可選的應用部署描述器標記

在某些情形下,有兩個可選的部署描述器標記可供使用,它們是和標記。

是的子標記,它的值是一個為模塊提供的從EAR文件的根開始的URI,指向另一個部署描述器文件。這個文件的命名不必和它在J2EE模塊里面時一樣。例如,所有EJB模塊的部署描述器必須命名為ejb-jar.xml,但如果標記的值指向一個EJB模塊的可選部署描述器,文件就可以取ejb-jar.xml以外的名字。

標記中指定的部署描述器文件將覆蓋J2EE模塊里面包含的描述器,。標記可以用來引用部署描述器的外部版本,當部署者想要使用的部署描述器與包含在EJB、Web應用、資源適配器或者應用客戶端模塊內(nèi)的描述器不同時,就可以使用這個標記。如果不指定標記的值,部署工具將使用EAR文件里面JAR、WAR或RAR文件中提供的值。例如,要為Web應用指定一個外部的可選部署描述器,假設該描述器在EAR文件的根下面,我們指定:



quote:
--------------------------------------------------------------------------------

<module>
<web>
<web-uri>web.war</web-uri>
<context-root>web</context-root>
</web>
<alt-dd>external-web.xml</alt-dd>
</module>

--------------------------------------------------------------------------------



標記用來指定應用級的安全角色,這個安全角色將用于EAR文件包含的所有J2EE模塊。如果EAR文件包含多個EJB模塊或多個Web應用模塊,這些模塊都可以有自己的安全角色定義。部署者的責任之一是確保所有J2EE模塊中包含的所有安全角色都有一個唯一的名字,而且對于應用整體來說具有實際意義。安全角色可以從J2EE模塊級“拉出”到企業(yè)應用級,加入到標記。也就是說,如果某個J2EE模塊中存在一個重復的安全角色值,該值可以刪除,只需在企業(yè)應用級提供即可。

標記需要一個子標記指定安全角色的名稱。下面是一個配置標記的例子:


quote:
--------------------------------------------------------------------------------

<security-role>
<description>
Security role of administrator
</description>
<role-name>Administrator</role-name>
</security-role>