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程序部署。