j2ee shared libraries是weblogic server 9.0(下简称wls9)的一个新特性。通过j2ee shared libraries可以将一个j2ee模块共享给其他企业应用(ear包或ear包的展开目录)的j2ee模块使用。j2ee shared library可以是任何类型的j2ee模块,但推荐设计成企业应用格式。此外还有一种j2ee 1.4的标准共享库方式,称为 optional packages。optional packages提供和j2ee libraries类似的方式将一个jar文件共享给多个应用。区别在于 optional packages是基于标准的,但不能被当作j2ee模块使用。optional packages必须通过部署对应的jar文件方式先被注册到domain。注册好后可以在任意j2ee模块中通过manifest files来引用这些jar包。optional packages和j2ee libraries的区别在于optional packages可以被任何j2ee模块(ear, jar, war, or rar 文档)或其对应扩展的目录结构引用。而j2ee libraries只能被企业应用引用。本文通过详细的说明将指导开发者熟悉这两种共享方式,并获得立竿见影的效果。
本文附件exercise包括j2ee libraries 和 optional packages的练习代码,可解压到任意位置。需要预先安装的软件只有wls9正式版,可以到www.bea.com.cn上免费下载。本练习可在能安装wls9的任何操作系统上完成,为了方便起见,文中仅以在windows上为例。首先配置一个wls domain,记得用户名和密码要都设为weblogic,端口为7001。然后启动该domain,并启动相应的console。最后使用domain/bin/setdomainenv.cmd打开一个prompt窗口,并把目录切换到你解压的文件的位置。这样你就可以按照第五节和六节所述完成练习。如果想快速看一下练习结果,在solution中有已经配置好的两个练习的代码,部署后就可以测试。
共享模块的核心:manifest.mf文件
我们知道在weblogic上部署的任何j2ee模块的根目录中可以有一个名为meta-inf的目录,你可以在一个j2ee模块的meta-inf目录下创建一个名为manifest.mf文件,来指定这个j2ee模块的版本。manifest.mf文件是一个纯文本文件,格式大概如下:
extension-name: myoptionalpackage
specification-version: 0.9
implementation-version: 1
extension-name:可选。表示该库或包的名字。主调应用调用这个应用时需要匹配这个值。如果你不设置这个值,系统将自动使用部署名。
specification-version:可选。定义这个库或包的规格版本。主调应用可以为共享模块随便指定一个规格版本。如果这个规格版本不可用,则主调应用不能被部署。规格参数可以有两种格式。第一种使用主从版本格式,大小版本号用点分割,如"9.0.1.1"。第二种使用文本格式,如 "9011beta"。如果使用主从版本号格式,主调应用可以配置为共享的模块吻合一个特定版本,或者一个最小版本,或者一个最新的版本额。如果使用文本格式,主调应用必须和共享模块的版本号严格吻合。
implementation-version:可选。定义这个库或包代码的执行版本号。必须在已经定义了规格版本的情况下才能定义执行版本。执行版本使用和规格版本相同的格式。
如果你不使用manifest.mf文件或者有些条目没有指定,可以在命令行中通过weblogic.deploy进行部署的时候由参数来设置。在后面的练习中我们将详细了解如何使用manifest.mf将一个j2ee应用设计为j2ee libraries或optional packages。
j2ee libraries and optional packages比较
optional packages和j2ee libraries有如下共同点:
1。在部署的时候都注册到domain上。
2。都支持可选的执行版本和规格版本字符串。
3。引用j2ee libraries and optional packages的应用可以指定共享文件的版本。
optional packages和j2ee libraries有如下区别:
1。optional package是普通的jar文件,而 j2ee libraries可以是普通jar文件,j2ee应用,或独立的j2ee模块。j2ee libraries可以包括有效地j2ee或wls部署描述符,而optional package jar中的任何部署描述符都被忽略了。
2。任何j2ee应用或模块可以通过meta-inf/manifest.mf引用 optional package。而只有企业应用可以通过weblogic-application.xml引用j2ee library 。
3。optional packages可以引用其他optional packages,而j2ee libraries不能引用其他j2ee libraries。
最佳实践
1。如果需要共享j2ee模块给多个企业应用应使用j2ee libraries。
2。如果要部署独立的j2ee模块作为共享库,应该把模块打包到企业应用中。这样可以防止潜在的uri冲突。因为独立模块库的uri来源于不署名。所以在部署时指定一个部署名,当其他应用引用它时作为uri。
3。如果多个j2ee应用需要共享一些java类,则应该用optional packages。
4。如果有一些类在本domain中需要被其他应用调用,而你又不经常升级这些类(比如第三方类),则最好把它们放在domain的 /lib目录下,而不是使用j2ee libraries或optional packages机制。在/lib子目录下的类会在server启动时候自动装载到系统环境变量中。
5。即使你不打算使用版本需要功能,通常也需要指定一个规格版本和一个执行版本。为库指定版本可以在做测试时为共享的文件部署多个版本。
6。通常为每个库指定一个扩展名,如果你不指定扩展名那系统会自动使用库的部署名作为扩展名。
7。当开发了一个web应用要部署成j2ee应用,应该使用唯一的上下文目录。如果它的上下文目录和他依赖的应用的上下文目录冲突,应该使用ear的weblogic-application.xml中context-root元素来覆盖库的上下文目录。
组装共享的j2ee library 文件
几乎所有独立的j2ee模块或企业应用可以被部署成shareable j2ee library,但有如下限制:
1。不能在一个j2ee library中引用另一个j2ee library.
2。共享库不能嵌套。如果你部署一个企业应用作为共享库,那整个这个企业应用必须被作为一个库,而不能指定这个企业应用中的某个独立j2ee模块为一个独立的库。
3。像其他j2ee模块和企业应用一样,j2ee library必须被部署到目标server或cluster上去。这意味着库需要一个有效的j2ee部署描述符和wls指定的部署描述符。
4。推荐把j2ee libraries打包成企业应用,而不是独立的j2ee模块。因为独立模块的uri来自于部署名。默认wls使用部署压缩文件的文件名或展开的目录名作为部署名。
5。如果你选择把库部署成独立的j2ee模块,通常应该指定一个部署名并把这个名字作为被应用引用的uri。
练习开发和部署shared j2ee library
本练习在j2eeshared目录下。可以看到有两个目录,其中sharedlibraryear是被调用的shareable j2ee library,callinglibraryear是调用该库的企业应用。通过把sharedlibraryear配置成共享库,callinglibraryear可以访问loanejb,就像打包在自己的企业应用中。
1.我们先来开发一个库应用。
观察一下sharedlibraryear下面的目录结构和文件。
目录loanejb是一个ejb结构。包括一个空的目录meta-inf和一个包含一个java文件simple.java的目录data。loanejb/data目录是放ejb的源代码,simple.java中是我手写的一个bean类。在目录loanejb下执行java com.bea.wls.ejbgen.ejbgen -descriptordir meta-inf data/simple.java就会在生成simplehome.java,simpleremote.java,ejb-jar.xml,weblogic-ejb-jar.xml和ejbgen-build.xml。然后到loanejb编译这几个class:javac data/*.java,生成根和桩文件。最后执行jar cvf ../loanejb.jar *,打包我们需要的ejb loanejb.jar到sharedlibraryear目录。
目录app-inf是一个空的目录,可以放入当前这个应用需要的第三方包。
目录meta-inf下包括application.xml和weblogic-application.xml。application.xml指定了这个应用所包含的只有一个ear模块:loanejb.jar,以及这个应用的部署名。为了把这个应用做成共享库,现在我们创建一个manifest.mf文件,并在里面写入如下信息:
extension-name: mylib
specification-version: 1.0
implementation-version: 1.0
然后在j2eeshared下执行java weblogic.appc sharedlibraryear,生成可部署的企业应用。
2.配置 callinglibraryear来引用sharedlibraryear模块。
观察一下callinglibraryear下面的目录结构和文件。
目录app-inf是放企业应用内部公用的类和库的目录。在这个练习中不需要使用。
目录loanapproval是一个web应用。index.jsp用于调用ejb loanejb的getstring方法,而没有指定这个ejb是来自本企业应用还是其他库。如果调用成功,则把在loanejb中设置的一个字符串显示在浏览器上。
目录meta-inf中包括application.xml和weblogic-application.xml。application.xml指定了这个应用所包含的只有一个web模块loanapproval。在weblogic-application.xml中除了编码方式,我们还要指定使用的共享库的名称。能看到在library-ref中我们指向了sharedlibraryear这个库mylib。同时在这个文件中我们还能指定库的规格版本和执行版本,以及是否需要严格匹配等。
在j2eeshared目录下执行java weblogic.appc -library sharedlibraryear callinglibraryear来预编译jsp。执行后会看到在loanapproval/web-inf/classes下面会生成一个目录jsp_servlet包含jsp被编译成的servlet__index.class和__error.class。由于在weblogic-application.xml中指定了使用的共享库,所以appc在调用jspc来编译jsp的时候能找到调用的ejb loanejb的命名空间以及对应类。
3。部署共享库和前端企业应用并测试。
确保你的server运行的情况下,在j2eeshared下执行下面两个命令来部署sharedlibraryear和callinglibraryear。注意执行以前console不能使被look状态的。
java weblogic.deployer -adminurl t3://localhost:7001 -user weblogic -password weblogic -deploy -library sharedlibraryear
执行之后在console的deployments部分能看到新添加了一个名为mylib(1.0)的库,状态为installed。
java weblogic.deployer -adminurl t3://localhost:7001 -user weblogic -password weblogic -deploy callinglibraryear
执行之后在console的deployments部分能看到新添加了一个名为callinglibraryear的应用,状态为active。
如果部署成功,在console和server窗口都不会有报错。打开一个浏览器测试一下:http://localhost:7001/loanapproval。如果一切正常,会显示在ejb中设置的那行字符串。
注意,当需要卸载库的时候,必须先卸载引用这个包的所有应用,然后activate change,然后再look,并且卸载库。
练习开发和部署optional packages
本练习在optionalpackages目录下。可以看到两个目录,其中simpappoptionalpackage是被调用的optional packages,simpappear是调用该包的企业应用。通过把simpappear配制成共享包,simpappoptionalpackage可以访问simpapp类就像打包在自己的企业应用中。
- 我们先来开发一个optional packages。
观察一下simpappoptionalpackage下面的目录结构和文件。
目录meta-inf中现在是空的。需要创建一个manifest.mf文件,包括如下内容:
extension-name: myoptionalpackage
specification-version: 0.9
implementation-version: 1
目录simp下面包含一个源代码文件simpapp.java,里面包含一些业务方法。在optionalpackages/simpappoptionalpackage/下执行javac simp/simple.java,会在simp目录下编译出simple.class。然后执行jar cvfm simpapp.jar meta-inf/manifest.mf *,把这个类打成一个名为simpapp.jar的jar包。
- 配置simpappear来引用simpappoptionalpackage模块。
观察一下simpappear下面的目录结构和文件。
目录app-inf和我们前面说的一样,就不赘述。
目录meta-inf下包括application.xml和weblogic-application.xml。application.xml指定了这个应用所包含的只有一个web模块simpappwebap。为了把这个应用做成optional packages,现在我们创建一个manifest.mf文件,并在里面写入如下信息:
extension-list: simpapp
simpapp-extension-name: myoptionalpackage
simpapp-extension-specification-version: 0.9
然后在optionalpackages下执行java weblogic.appc -classpath simpappoptionalpackage/simpapp.jar simpappear,生成可部署的企业应用。注意这次我们没在appc中使用-library,因为使用 optional packages的时候不需要获得它的部署描述符。但我们需要指定optional packages模块的位置放到classpath里编译jsp。
- 部署optionalpackages和前端企业应用并测试。
确保你的server运行的情况下,在optionalpackages下执行下面两个命令来部署simpappoptionalpackage和simpappear。注意执行以前console不能是被look状态的。
java weblogic.deployer -adminurl t3://localhost:7001 -user weblogic -password weblogic -deploy -library simpappoptionalpackage/simpapp.jar
java weblogic.deployer -adminurl t3://localhost:7001 -user weblogic -password weblogic -deploy simpappear
如果部署成功,在console和server窗口都不会有报错。打开一个浏览器测试一下:http://localhost:7001/simpappwebapp/。如果一切正常,会显示在simple.java中设置的那行字符串。
闽公网安备 35060202000074号