J2EE应用部署(二):实践篇 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
在上一篇文章中,我们 角色和行为。接下来就可以 以及应用部署描述器的内容
|
了解了J2EE应用封装和部署的一 配置和部署企业应用。为此,我 。
|
些基本知识,包括类装载器的不同 们必须了解创建EAR文件的过程,
|
构造各个组件,包括EJB、JSP页面、Servlet和资源适配器等。 |
把这些组件打包成JAR 一种具有相同类型的一个或 上的EJB,一个Web应用模块 资源适配器。
|
文件格式的J2EE模块,同时提供 者多个J2EE组件的集合,也就是 可以包含多个JSP页面和Servlet
|
J2EE模块部署描述器。J2EE模块是 说,一个EJB模块可以包含一个以 ,一个资源适配器包可以包含多个
|
结合一个或者多个J2EE 用。最简单的J2EE应用只包 成,更复杂的J2EE应用可以 还可以包含描述部署过程的
|
模块创建EAR文件,同时提供企 含一个J2EE模块,稍微复杂一点 包含多个J2EE模块、模块里面包 帮助文件和其他文档。
|
业应用部署描述器,构造出J2EE应 的J2EE应用可以由多个J2EE模块构 含的类所用到的依赖库。J2EE应用
|
把J2EE应用部署到J2EE平台上。安装 合。在J2EE应用部署过程中,每一个J2EE 被部署到适合该组件类型的合适容器。例 。部署应用时,应用服务器的部署工具将 的部署机制将提取出my.jar和my.war模块 如果这两个模块都部署成功,则整个J2EE
|
J2EE应用,然后把它与应用服务器提供的基础设施整 模块按照该类模块的部署要求分别部署,每一个组件 如,假设有一个my.ear文件,它包含my.jar和my.war 把my.ear文件拷贝到应用服务器;接着,应用服务器 ,按照当前平台的类装载要求分别部署这两个模块。 应用部署成功。
|
组件被封装成J2EE模块时带有一个部 具还可以用来部署和“反部署”独立的J2 描述器封装成J2EE应用,用来把额外的内 整个应用部署到应用服务器上。
|
署描述器,J2EE模块可以通过部署工具创建。部署工 EE模块,用来把一个或者多个J2EE模块和另外的部署 容加入J2EE应用或从J2EE应用删除某些内容,或者把
|
J2EE企业应用包的结构 application.xml的部署描 EAR文件可以包含依赖库,
|
很简单,它由一个或多个J2EE模 述器构成。文件用JAR格式打包 但这是可选的。EAR文件的一般
|
块以及一个META-INF目录下名为 ,存储在扩展名为.ear的文件中。 结构是:
|
EJB .jar文件 Web应用.war文件 资 文件 META-INF application.xml
|
源适配器.rar文件 应用客户端.jar文件 依赖库.jar
|
下面是一个EAR文件的
|
例子,它包含一个EJB模块、一
|
个Web应用模块,不包含依赖库:
|
MyFirstEJB.jar MyFir
|
stWeb.war META-INF applicat
|
ion.xml
|
保存在EAR文件中的J2E EJB模块、一个资源适配器
|
E模块不一定要在根目录之下。 包,它的结构可以如下:
|
例如,假设一个EAR文件包含一个
|
ejbs MySecondEJB.jar resources application.xml
|
MyLegacyAdapter.rar META-INF
|
最后,下面是一个包含许多组件和依赖库的EAR文件: |
ejbs MyThirdEJB.jar MyFourthEJB MyWebApp1.war MyWebApp2.war lib Myx application.xml
|
.jar resources MyLegacyAdapter.rar web mlx.jar Mycommon.jar META-INF
|
EAR文件可以用部署工
|
具创建,或者也可以改用JDK提
|
供的jar工具创建。创建步骤为:
|
把所有J2EE模块放入临时目录,创建META-INF目录。 |
在META-INF目录下创建application.xml部署描述器。 |
完成上述步骤之后,进入临时目录,运行jar工具创建EAR文件。 |
下面是一个运行jar工具的例子,它对前面例子进行打包: |
jar cvf MyApplicatio
|
n.ear ejbs resources web lib
|
META-INF
|
创建好EAR文件之后,我们就可以把J2EE应用部署到应用服务器上。 |
理想情况下,我们用图形界面的工具 工构造或维护application.xml文件,因
|
编写application.xml文件。然而,有时我们必须手 此理解application.xml文件用到的标记很重要。
|
application.xml部署 。部署描述器的DTD定义的
|
描述器并不复杂,不需要很多标 标记包括:
|
记就可以构造出一个合法的描述器
|
所有合法的J2EE应用描述器必须包含如下DOCTYPE声明: |
|
n PUBLIC "-//Sun Microsystem
|
s, Inc.//DTD J2EE Application
|
1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd"> |
配置一个简单的application.xml部署描述器只需如下几步: |
用标记声明一个企业应用。标记可以 使用。这些标记的内容和EJB、Web应用、
|
包含、和标记,供部署工具提供有关应用的描述信息 资源适配器部署描述器内的同一标记的内容相同。
|
企业应用内的每一个模 记描述,资源适配器用标记 容都是指定EAR文件内包含J
|
块必须有一个相应的标记描述模 描述,应用客户端程序用标记描 2EE模块的文件的相对URI,该UR
|
块。EJB用标记描述,Web应用用标 述。除了标记之外,其他标记的内 I必须相对于EAR文件的根。
|
如果企业应用包含一个Web应用J2EE 相对URI,指定EAR文件内包含J2EE模块的 Web应用将在其下运行的上下文的名字。 须加上该上下文名字作为前缀。例如,如
|
模块,则必须提供一个标记和一个标记。标记是一个 文件。这个URI和、、标记的URI同属一类。标记指定 所有针对该Web应用内JSP页面和Servlet的请求都必 果部署Web应用时指定了:
|
则所有对JSP页面和Servlet的请求必须是如下形式: |
在EAR文件内封装的每 的值。如果EAR文件只包含
|
一个Web应用都要有一个唯一的 一个Web应用,的值可以是空字
|
值,任何两个Web应用不能有相同 符串。
|
在大多数使用EAR文件 用要用到EJB模块里面的EJB 库。下面我们来看看构造这
|
的情形中,企业应用包含一个EJ 组件。下面的例子就属于这种情 个例子的具体过程。
|
B模块、一个Web应用模块,Web应 况,EJB和Web应用不需要任何依赖
|
在这个例子中,一个Servlet在无状 和EJB输出一些文字信息表明程序已经成 组件封装存在问题。本例的所有EJB源文 到的Java文件包括:
|
态会话EJB的远程接口上调用invoke()方法,Servlet 功执行。如果控制台出现异常报告,它很可能意味着 件都属于test包,Servlet属于未命名的包。本例用
|
MyEnterpriseServlet.
|
java:Servlet的实现类,执行
|
对EJB的调用
|
MyEnterprise.java:EJB的远程接口。 |
MyEnterpriseHome.java:EJB的Home接口。 |
MyEnterpriseBean.java::EJB的实现类。 |
MyEnterpriseBean.java的实现代码是: |
public class MyEnterpriseBean im
|
plements SessionBean {
|
private InitialContext ctx; |
public void ejbCreate() {} |
public void ejbRemove() {} |
public void ejbActivate() {} |
public void ejbPassivate() {} |
public void setSessionContext(Se
|
ssionContext c) {}
|
System.out.println("正在执行EJB."); |
MyEnterpriseServlet.
|
java Servlet的实现代码是:
|
import javax.servlet.http.*; |
public class MyEnter
|
priseServlet extends HttpSer
|
vlet {
|
public void service(HttpSe
|
rvletRequest req, HttpServletResponse res)
|
res.setContentType("text
|
/html;charset=GB2312");
|
PrintWriter
|
out = res.getWriter();
|
System.o
|
ut.println("正在服务器上运行
|
Servlet");
|
InitialC
|
ontext ctx = new InitialCont
|
ext();
|
test.M
|
yEnterpriseHome eHome = (tes
|
t.MyEnterpriseHome)
|
|
ctx.lookup("My
|
EnterpriseEJB");
|
test.MyEnterprise
|
e = eHome.create();
|
System.ou
|
t.println("异常: " + e);
|
out.println("
检查控制台确信EJB已经被调用"); |
编写好EJB和相关的部 MyEnterpriseBean.jar文件 Servlet代码和相关的部署 文件。
|
署描述器(此处不列出)之后, 。在JNDI名称空间配置中,EJB 描述器(此处也不列出)之后,
|
接下来要把EJB封装成 绑定到MyEnterpriseEJB。编写好 Servlet应该封装成MyWebApp.war
|
构造好各个组件之后,接下来应该编 册为企业应用的模块,还要让Web应用的 application.xml文件应该为:
|
写企业应用部署描述器。我们必须把EJB和Web应用注 组件在/web/上下文之下执行。这样,本例的
|
|
n PUBLIC '-//Sun Microsystem
|
s, Inc.//DTD J2EE Application
|
1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'> |
编写好application.xml部署描述器之后,企业应用的目录将包括: |
MyEnterpriseBean.jar MyWebApp.wa
|
r META-INF application.xml
|
用jar工具创建名为MyE
|
nterprise.ear的EAR文件,控制
|
台命令如下:
|
jar cvf MyEnterprise
|
.ear MyEnterpriseBean.jar My
|
WebApp.war META-INF
|
值得一提的是,如果使用J2EE参考实 ,我们不必手工编写ejb-jar.xml、web.x deploytool自动生成。在本例的企业应用
|
现(Reference Implementation)提供的deploytool ml和application.xml部署描述器,这些文件由 中,application.xml就是自动生成的。
|
构造好EAR文件之后, 应商提供了不同的部署工具 。
|
接下来该部署它了。记住,具体 。例如,J2EE的deploytool能够
|
的部署操作和平台有关,不同的供 把企业应用部署到J2EE参考实现上
|
成功地部署好企业应用之后,接下来 是/web,Servlet作为它的一部分调用。
|
就可以调用Servlet了。由于该企业应用上下文的根 为此,我们在浏览器中输入的地址应该是如下形式:
|
http://主机:端口/web/myenterpriseservlet/ |
在某些情形下,有两个可选的部署描述器标记可供使用,它们是和标记。 |
是的子标记,它的值是一个为模块提 器文件。这个文件的命名不必和它在J2EE 必须命名为ejb-jar.xml,但如果标记的 取ejb-jar.xml以外的名字。
|
供的从EAR文件的根开始的URI,指向另一个部署描述 模块里面时一样。例如,所有EJB模块的部署描述器 值指向一个EJB模块的可选部署描述器,文件就可以
|
标记中指定的部署描述 署描述器的外部版本,当部 者应用客户端模块内的描述 将使用EAR文件里面JAR、WA 部署描述器,假设该描述器
|
器文件将覆盖J2EE模块里面包含 署者想要使用的部署描述器与包 器不同时,就可以使用这个标记 R或RAR文件中提供的值。例如, 在EAR文件的根下面,我们指定
|
的描述器,。标记可以用来引用部 含在EJB、Web应用、资源适配器或 。如果不指定标记的值,部署工具 要为Web应用指定一个外部的可选 :
|
标记用来指定应用级的安全角色,这 果EAR文件包含多个EJB模块或多个Web应 署者的责任之一是确保所有J2EE模块中包 用整体来说具有实际意义。安全角色可以 也就是说,如果某个J2EE模块中存在一个 级提供即可。
|
个安全角色将用于EAR文件包含的所有J2EE模块。如 用模块,这些模块都可以有自己的安全角色定义。部 含的所有安全角色都有一个唯一的名字,而且对于应 从J2EE模块级“拉出”到企业应用级,加入到标记。 重复的安全角色值,该值可以删除,只需在企业应用
|
标记需要一个子标记指定安全角色的名称。下面是一个配置标记的例子: |
Security role of administrator |
在下一篇文章中,我们将了解J2EE应用封装和部署过程中可能遇到的一些问题。 |
|
|
|
|
|