爱心技术专栏专题

J2EE应用部署(二):实践篇

摘录:爱心 来源:爱心 加入时间:2006年08月11日
摘要:
J2EE应用部署(二):实践篇
=================================== 
提纲: 
=================================== 

一、配置J2EE包 
      
     &nbs;…

转载:转载请保留本信息,本文来自
http://www.51dibs.com
/html/2006/article/info/a_370aeaa7d9ad5bfb.htm

J2EE应用部署(二):实践篇

站点:爱心种子小博士 关键字:J2EE应用部署(二):实践篇

   
J2EE应用部署(二):实践篇
=================================== 
提纲: 
=================================== 

一、配置J2EE包 
      
       1.1 企业应用的开发过程 
       1.2 J2EE应用包的结构 
       1.3 EAR部署描述器 

二、一个简单的实例 

    2.1 组件 
      2.2 装配应用 
      2.3 部署和运行应用 

三、可选的应用部署描述器标记 

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

在上一篇文章中,我们了解了J2EE应用封装和部署的一些基本知识,包括类装载器的不同角色和行为。接下来就可以配置和部署企业应用。为此,我们必须了解创建EAR文件的过程,以及应用部署描述器的内容。 

1.1 企业应用的开发过程 

构造一个企业应用的过程可以归纳为: 

构造各个组件,包括EJB、JSP页面、Servlet和资源适配器等。 

把这些组件打包成JAR文件格式的J2EE模块,同时提供J2EE模块部署描述器。J2EE模块是一种具有相同类型的一个或者多个J2EE组件的集合,也就是说,一个EJB模块可以包含一个以上的EJB,一个Web应用模块可以包含多个JSP页面和Servlet,一个资源适配器包可以包含多个资源适配器。 

结合一个或者多个J2EE模块创建EAR文件,同时提供企业应用部署描述器,构造出J2EE应用。最简单的J2EE应用只包含一个J2EE模块,稍微复杂一点的J2EE应用可以由多个J2EE模块构成,更复杂的J2EE应用可以包含多个J2EE模块、模块里面包含的类所用到的依赖库。J2EE应用还可以包含描述部署过程的帮助文件和其他文档。 

把J2EE应用部署到J2EE平台上。安装J2EE应用,然后把它与应用服务器提供的基础设施整合。在J2EE应用部署过程中,每一个J2EE模块按照该类模块的部署要求分别部署,每一个组件被部署到适合该组件类型的合适容器。例如,假设有一个my.ear文件,它包含my.jar和my.war。部署应用时,应用服务器的部署工具将把my.ear文件拷贝到应用服务器;接着,应用服务器的部署机制将提取出my.jar和my.war模块,按照当前平台的类装载要求分别部署这两个模块。如果这两个模块都部署成功,则整个J2EE应用部署成功。 

J2EE企业应用开发和部署过程可以图示如下: 



组件被封装成J2EE模块时带有一个部署描述器,J2EE模块可以通过部署工具创建。部署工具还可以用来部署和“反部署”独立的J2EE模块,用来把一个或者多个J2EE模块和另外的部署描述器封装成J2EE应用,用来把额外的内容加入J2EE应用或从J2EE应用删除某些内容,或者把整个应用部署到应用服务器上。 

1.2 J2EE应用包的结构

J2EE企业应用包的结构很简单,它由一个或多个J2EE模块以及一个META-INF\目录下名为application.xml的部署描述器构成。文件用JAR格式打包,存储在扩展名为.ear的文件中。EAR文件可以包含依赖库,但这是可选的。EAR文件的一般结构是: 

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模块、一个资源适配器包,它的结构可以如下: 
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文件可以用部署工具创建,或者也可以改用JDK提供的jar工具创建。创建步骤为: 

创建一个用来容纳EAR文件内容的临时目录。 
把所有J2EE模块放入临时目录,创建META-INF\目录。 
在META-INF\目录下创建application.xml部署描述器。 
完成上述步骤之后,进入临时目录,运行jar工具创建EAR文件。 

下面是一个运行jar工具的例子,它对前面例子进行打包: 
jar cvf MyApplication.ear ejbs resources web lib META-INF  

创建好EAR文件之后,我们就可以把J2EE应用部署到应用服务器上。 

1.3 EAR部署描述器

理想情况下,我们用图形界面的工具编写application.xml文件。然而,有时我们必须手工构造或维护application.xml文件,因此理解application.xml文件用到的标记很重要。 

application.xml部署描述器并不复杂,不需要很多标记就可以构造出一个合法的描述器。部署描述器的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部署描述器只需如下几步: 
用标记声明一个企业应用。标记可以包含、和标记,供部署工具提供有关应用的描述信息使用。这些标记的内容和EJB、Web应用、资源适配器部署描述器内的同一标记的内容相同。 

企业应用内的每一个模块必须有一个相应的标记描述模块。EJB用标记描述,Web应用用标记描述,资源适配器用标记描述,应用客户端程序用标记描述。除了标记之外,其他标记的内容都是指定EAR文件内包含J2EE模块的文件的相对URI,该URI必须相对于EAR文件的根。 

如果企业应用包含一个Web应用J2EE模块,则必须提供一个标记和一个标记。标记是一个相对URI,指定EAR文件内包含J2EE模块的文件。这个URI和、、标记的URI同属一类。标记指定Web应用将在其下运行的上下文的名字。所有针对该Web应用内JSP页面和Servlet的请求都必须加上该上下文名字作为前缀。例如,如果部署Web应用时指定了: 

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

则所有对JSP页面和Servlet的请求必须是如下形式: 

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

在EAR文件内封装的每一个Web应用都要有一个唯一的值,任何两个Web应用不能有相同的值。如果EAR文件只包含一个Web应用,的值可以是空字符串。 

二、一个简单的实例

在大多数使用EAR文件的情形中,企业应用包含一个EJB模块、一个Web应用模块,Web应用要用到EJB模块里面的EJB组件。下面的例子就属于这种情况,EJB和Web应用不需要任何依赖库。下面我们来看看构造这个例子的具体过程。 

2.1 组件 

在这个例子中,一个Servlet在无状态会话EJB的远程接口上调用invoke()方法,Servlet和EJB输出一些文字信息表明程序已经成功执行。如果控制台出现异常报告,它很可能意味着组件封装存在问题。本例的所有EJB源文件都属于test包,Servlet属于未命名的包。本例用到的Java文件包括: 

MyEnterpriseServlet.java:Servlet的实现类,执行对EJB的调用 
MyEnterprise.java:EJB的远程接口。 
MyEnterpriseHome.java:EJB的Home接口。 
MyEnterpriseBean.java::EJB的实现类。 


MyEnterpriseBean.java的实现代码是: 


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("正在执行EJB.");

}  


MyEnterpriseServlet.java Servlet的实现代码是: 



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已经被调用</h1>");
        out.println("</body></html>"); 

}  



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



编写好EJB和相关的部署描述器(此处不列出)之后,接下来要把EJB封装成MyEnterpriseBean.jar文件。在JNDI名称空间配置中,EJB绑定到MyEnterpriseEJB。编写好Servlet代码和相关的部署描述器(此处也不列出)之后,Servlet应该封装成MyWebApp.war文件。 

2.2 装配应用 

构造好各个组件之后,接下来应该编写企业应用部署描述器。我们必须把EJB和Web应用注册为企业应用的模块,还要让Web应用的组件在/web/上下文之下执行。这样,本例的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部署描述器之后,企业应用的目录将包括: 
MyEnterpriseBean.jar MyWebApp.war META-INF\ application.xml  
用jar工具创建名为MyEnterprise.ear的EAR文件,控制台命令如下: 

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


值得一提的是,如果使用J2EE参考实现(Reference Implementation)提供的deploytool,我们不必手工编写ejb-jar.xml、web.xml和application.xml部署描述器,这些文件由deploytool自动生成。在本例的企业应用中,application.xml就是自动生成的。 

2.3 部署和运行应用 

构造好EAR文件之后,接下来该部署它了。记住,具体的部署操作和平台有关,不同的供应商提供了不同的部署工具。例如,J2EE的deploytool能够把企业应用部署到J2EE参考实现上。 

成功地部署好企业应用之后,接下来就可以调用Servlet了。由于该企业应用上下文的根是/web,Servlet作为它的一部分调用。为此,我们在浏览器中输入的地址应该是如下形式: 

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


三、可选的应用部署描述器标记 

在某些情形下,有两个可选的部署描述器标记可供使用,它们是和标记。 

是的子标记,它的值是一个为模块提供的从EAR文件的根开始的URI,指向另一个部署描述器文件。这个文件的命名不必和它在J2EE模块里面时一样。例如,所有EJB模块的部署描述器必须命名为ejb-jar.xml,但如果标记的值指向一个EJB模块的可选部署描述器,文件就可以取ejb-jar.xml以外的名字。 

标记中指定的部署描述器文件将覆盖J2EE模块里面包含的描述器,。标记可以用来引用部署描述器的外部版本,当部署者想要使用的部署描述器与包含在EJB、Web应用、资源适配器或者应用客户端模块内的描述器不同时,就可以使用这个标记。如果不指定标记的值,部署工具将使用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模块级“拉出”到企业应用级,加入到标记。也就是说,如果某个J2EE模块中存在一个重复的安全角色值,该值可以删除,只需在企业应用级提供即可。 

标记需要一个子标记指定安全角色的名称。下面是一个配置标记的例子: 


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

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


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


在下一篇文章中,我们将了解J2EE应用封装和部署过程中可能遇到的一些问题。


客户服务中心信箱:[email protected] [email protected] 网站地图

声明

合作伙伴: