`
sqiutz
  • 浏览: 71348 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

WAS 6.1 的类加载四

阅读更多

12.5.2 步骤 2:添加一个EJB模块和工具JAR

下面,往应用程序中添加一个EJB,它也依赖VersionChecker JAR文件。在此,在EAR的根目录添加一个VersionCheckerV2.jar 文件。在这个JAR文件中的VersionChecker  类返回了Version 2.0。为了保证扩展类加载中的工具JAR可用,在EJB模块的manifest文件中添加一个引用,如例12-8:

例12-8 更新EJB模块的 MANIFEST.MF 文件

Manifest-Version: 1.0

Class-Path: VersionCheckerV2.jar

现在的结果是:有一个Web模块,在它的WEB-INF/classes 目录下面有一个servlet,在WEB-INF/lib 目录下面有VersionCheckerV1.jar 文件。还有一个EJB模块引用了EAR根目录下面的VersionCheckerV2.jar 工具JAR。你期望Web模块装入VersionChecker 类文件的版本是什么?是WEB-INF/lib 下的Version 1.0 还是工具JAR下面的Version 2.0?测试结果如例12-9:

例12-9 类加载 例2

VersionChecker called from Servlet

VersionChecker is v2.0.

Loaded bycom.ibm.ws.classloader.CompoundClassLoader@26282628

Local ClassPath:

C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\WebSphere\AppServ

er\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\ClassloaderExample

.ear\VersionCheckerV2.jar

Delegation Mode: PARENT_FIRST

VersionChecker called from EJB

VersionChecker is v2.0.

Loaded bycom.ibm.ws.classloader.CompoundClassLoader@26282628

Local ClassPath:

C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\WebSphere\AppServ

er\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\ClassloaderExample

.ear\VersionCheckerV2.jar

Delegation Mode: PARENT_FIRST

正如所看到的,当同时调用EJB模块和Web模块,VersionChecker 是 Version 2.0 。当然,原因是:WAR类加载器将请求委托给了父类加载器而不是他自己,所以工具JAR就被同一个类加载器加载,而无需考虑请求是来自于servlet还是EJB。

12.5.3 步骤 3:改变WAR类加载的委托模式

现在是否希望Web模块使用WEB-INF/lib 目录下面的VersionCheckerV1.jar 文件?为了这个目的,需要先将类加载委托模式从parent first 改为parent last。

设置委托模式为PARENT_LAST,使用如下步骤:

1. 在向导栏选择Enterprise Applications;

2. 选择ClassloaderExample 应用程序;

3. 在模块部分选择Manage modules ;

4. 选择ClassloaderExampleWeb 模块;

5. 将类加载顺序修改成应用程序类加载优先(PARENT_LAST)。记住,这个条目应该称为WAR类加载优先,参见 “类加载/委托模式”;

6. 单击 OK.

7. 保存配置

8. 重新启动应用程序。

WEB-INF/lib 下的VersionCheckerV1 返回version of 1.0。可以在例12-10中看到:

例12-10 类加载 例3

VersionChecker called from Servlet

VersionChecker is v1.0.

Loaded bycom.ibm.ws.classloader.CompoundClassLoader@4d404d40

Local ClassPath:

C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

l\ClassloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\classes;C:\W

ebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\Cl

assloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\lib\VersionCheck

erV1.jar;C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8

Node02Cell\ClassloaderExample.ear\ClassloaderExampleWeb.war

Delegation Mode: PARENT_LAST

VersionChecker called from EJB

VersionChecker is v2.0.

Loaded bycom.ibm.ws.classloader.CompoundClassLoader@37f437f4

Local ClassPath:

C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\WebSphere\AppServ

er\profiles\AppSrv02\installedApps \kcgg1d8Node02Cell\ClassloaderExample

.ear\VersionCheckerV2.jar

Delegation Mode: PARENT_FIRST

如果你使用类加载器的搜索功能,搜索*VersionChecker*,会得到图12-9:

图12-9 类加载查看器搜索功能

例12-11 显示源代码

例12-11 类加载查看器搜索功能

WAS Module Compound Class Loader (WAR class loader):

file: / C: / WebSphere / AppServer / profiles / AppSrv02 /

installedApps / kcgg1d8Node02Cell / ClassloaderExample.ear /

ClassloaderExampleWeb.war / WEB-INF / lib / VersionCheckerV1.jar

WAS Module Jar Class Loader (Application class loader):

file: / C: / WebSphere / AppServer / profiles / AppSrv02 /

installedApps / kcgg1d8Node02Cell / ClassloaderExample.ear /

VersionCheckerV2.jar

12.5.4 步骤 4:使用共享库共享工具JAR

在此之前,只有一个应用程序使用VersionCheckerV2.jar 文件。是否希望多个应用程序能够共享它?当然,你可以在每个EAR文件中把这个文件打包进去。但是如果需要修改这个工具JAR,那需要重新部署所有的应用程序。为了避免这个麻烦,你可以使用共享库全局共享这个JAR文件。

共享库可以定义在单元、节点、应用程序服务器集群。一旦你定义了共享库,必须将它跟应用程序服务器的类加载器或者单独的Web模块关联起来。根据共享库指派的目的地不同,WebSphere会使用匹配的类加载器加载共享库。

只要愿意,可以定义多个共享库。也可以为应用程序、Web模块或者应用程序服务器指派多个共享库。

在应用程序级别使用共享库
定义一个名为VersionCheckerV2_SharedLib 的共享库,并把它跟ClassloaderTest 应用程序关联起来,步骤如下:

1.     在管理控制台,选择Environment → Shared Libraries;

2.     选择共享库的作用域,比如单元,单击New;

3.     如图12-10:

图 12-10 共享库配置

– Name: 输入VersionCheckerV2_SharedLib;

– Class path: 输入类路径中的条目,每个条目之间用回车隔开。如果提供绝对路径,建议是用WebSphere环境变量,比如 %FRAMEWORK_JARS%/VersionCheckerV2.jar ,确定你已经定义了一个和共享库相同作用域的变量。

– Native library path: 输入JNI代码使用的DLLs 和.so 文件列表。

4.     单击 OK;

5.     选择 Applications → Enterprise Applications;

6.     选择应用程序 ClassloadersExample ;

7.     在引用选项,选择 Shared library references ;

8.     在应用程序列选择 ClassloaderExample ;

9.     单击 Reference shared libraries;

10.  选择 VersionCheckerV2_SharedLib ,单击 >> 按钮将选中的移动到 Selected 列,如下图12-11:

图12-11 指定一个共享库

 

11.  单击OK ;

12.  ClassloaderExample 应用程序共享库配置窗口如下图12-12:

图12-12 将共享库指派给应用程序 ClassloaderExample


 

13.  单击OK ,保存配置。

如果我们现在从EAR文件的根目录将VersionCheckerV2.jar删除,在EJB模块的manifest文件中也把引用删除,重新启动应用服务器,看到例12-12的结果。记住,Web模块的类加载顺序依然是应用程序类加载优先(PARENT_LAST)。

例12-12 类加载 例4

VersionChecker called from Servlet

VersionChecker is v1.0.

Loaded bycom.ibm.ws.classloader.CompoundClassLoader@2e602e60

Local ClassPath:

C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

l\ClassloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\classes;C:\W

ebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\Cl

assloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\lib\VersionCheck

erV1.jar;C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8

Node02Cell\ClassloaderExample.ear\ClassloaderExampleWeb.war

Delegation Mode: PARENT_LAST

VersionChecker called from EJB

VersionChecker is v2.0.

Loaded bycom.ibm.ws.classloader.CompoundClassLoader@19141914

Local ClassPath:

C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

l\ClassloaderExample.ear\ClassloaderExampleEJB.jar;C:\henrik\VersionChe

ckerV2.jar

Delegation Mode: PARENT_FIRST

正如预料的,由于Web模块的委托模式,当servlet 需要VersionChecker 类,VersionCheckerV1.jar 文件被加载。当EJB需要VersionChecker 的类的时候,就会从指向C:\henrik\VersionCheckerV2.jar 的共享库中加载它。如果你希望Web模块也使用共享库,只需要将类加载顺序恢复成缺省值,Web模块的类加载是父类加载优先。

在应用程序服务器级别使用共享库
共享库也可以跟应用程序服务器关联起来。在这个服务器上的部署的所有应用程序都能够看到共享库的代码列表。要把共享库跟应用程序服务器关联起来,首先要为应用程序服务器创建一个附加的类加载器,步骤如下:

1.     选择应用程序服务器;

2.     在应用程序基础结构部分,展开 Java and Process Management,选择 Class loader;

3.     选择New,为这个类加载器选择类加载顺序,父类加载优先 (PARENT_FIRST) 或者应用程序类加载优先 (PARENT_LAST),单击 Apply;

4.     单击刚刚创建的类加载器;

5.     单击 Shared library references;

6.     单击 Add,选择希望跟应用程序服务器关联的库。重复选择操作,将多个库跟这个类加载器关联。比如选择 VersionCheckerV2_SharedLib 条目;

7.     单击 OK;

8.     保存配置;

9.     重新启动应用程序服务器,修改才会生效。

将VersionCheckerV2  共享库跟应用程序服务器关联起来,就得到例12-13的结果。

例12-13 类加载 例5

VersionChecker called from Servlet

VersionChecker is v1.0.

Loaded bycom.ibm.ws.classloader.CompoundClassLoader@40c240c2

Local ClassPath:

C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cel

l\ClassloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\classes;C:\W

ebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8Node02Cell\Cl

assloaderExample.ear\ClassloaderExampleWeb.war\WEB-INF\lib\VersionCheck

erV1.jar;C:\WebSphere\AppServer\profiles\AppSrv02\installedApps\kcgg1d8

Node02Cell\ClassloaderExample.ear\ClassloaderExampleWeb.war

VersionChecker called from EJB

VersionChecker is v2.0.

Loaded bycom.ibm.ws.classloader.ExtJarClassLoader@7dee7dee

Local ClassPath: C:\henrik\VersionCheckerV2.jar

Delegation Mode: PARENT_FIRST

我们定义的新的名为 ExtJarClassLoader  类加载器,在EJB模块请求时,它装入VersionCheckerV2.jar 文件。由于委托模式,WAR类加载器继续装入自己的version。

12.6 类加载器问题诊断

    JVM 5.0提供了一些配置,可以让我们查看详细的类装入,比如JVM 参数 -verbose:dynload、-Dibm.cl.verbose=<name>。

    在实际开发过程中,如果使用不当,会出现很多类加载相关的问题。当遇到类加载问题时,可以查看WAS的相关日志,在日志中出现如下异常,可以认为是类加载器出现了问题:

ClassCastException

ClassNotFoundException

NoClassDefFoundError

NoSuchMethodError

IllegalArgumentException

UnsatisfiedLinkError

VerifyError

关于问题诊断,将在下一篇文章《WAS 6.1 类加载问题诊断》详细阐述。

总结

本文针对WAS6.1版本,详细介绍了类加载的概念以及如何客户化,并通过几个例子向大家讲述了影响类加载的选项的使用。虽然WAS 6.1 允许根据需要修改类加载策略,比如将父类优先改成应用程序优先,但是不推荐这么使用。笔者曾经就遇到因为修改策略,导致应用程序无法启动。原因是WAS中的组件和应用程序使用的某些类是一致的,加载策略选择不正确,就会导致类加载错误。

参考资料

1.WebSphere Application Server V6.1: System Management and Configuration

http://www.redbooks.ibm.com/abstracts/sg247304.html?Open

2.WebSphere Application Server V6.1: Classloader Problem Determination

http://www.redbooks.ibm.com/abstracts/redp4307.html?Open

3.类装入问题解密,第 1 部分: 类装入和调试工具介绍

http://www.ibm.com/developerworks/cn/java/j-dclp1/

4.类装入问题解密,第 2 部分: 基本的类装入异常

http://www.ibm.com/developerworks/cn/java/j-dclp2.html

5.类装入问题解密,第 3 部分: 处理更少见的类装入问题

http://www.ibm.com/developerworks/cn/java/j-dclp3/

6.类装入问题解密,第 4 部分: 死锁和约束

http://www.ibm.com/developerworks/cn/java/j-dclp4/

7.J2EE 类装入揭密

http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0112_deboer/deboer.html

8.WAS 6.1 信息中心

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp 

关于作者

胡伟红,西安交通大学硕士,目前就职于IBM 软件部。主要负责 WebShpere软件产品的技术支持。可通过huweih@cn.ibm.com与她联系。

分享到:
评论

相关推荐

    WAS6.1配置双向SSL

    ### WAS6.1双向SSL配置详解 #### 一、引言 随着网络安全需求的日益增长,WebSphere Application Server (简称WAS)作为一款强大的企业级Java应用服务器,提供了丰富的安全特性来满足各种业务场景下的安全需求。其中...

    MYEclipse6.0下Websphere6.1的配置

    #### 四、在 MyEclipse 中配置 WebSphere 6.1 1. **创建 Web 工程**: - 在 MyEclipse 中创建一个新的 Web Project 或 Enterprise Application Project。 - 注意:创建 Enterprise Application Project 不是必须...

    按步骤详细说明was(application WebSphere server)服务器对cas证书生成、SSL配置、类加载、数据源配置、部署等操作.doc

    - **Parent Last**:子类加载器在查找类时,会先尝试自己加载类,然后再请求父加载器加载。 - **Parent First**:与 Parent Last 相反,子类加载器会先请求父加载器加载类,如果父加载器找不到,则再尝试自己加载...

    IBM WebSphere 6.1 ND 集群安装配置

    这可能包括API调用、页面加载、事务处理等。 **集群功能测试验证** 最后,对集群的高可用性和负载均衡进行测试,例如模拟节点故障,检查服务是否能够自动切换到其他节点;测试负载均衡,确保请求被均匀分配到各个...

    WebSphere6.1 for oracle数据源配置

    这通常可以通过将驱动复制到`&lt;WAS_HOME&gt;/lib`目录或者在应用服务器的类加载器中指定。 2. **创建JDBC提供者**:在WebSphere管理控制台中,导航至“资源”-&gt;“JDBC提供者”,点击“新建”,选择适当的JDBC驱动类型,...

    CXF support WAS Weblogic

    - **安装了Web Services Feature Pack**:对于版本为6.1.0.29及更高版本,同样需要将JAR文件放置在endorsed文件夹内,但还需要额外配置自定义类加载器。 **2. Weblogic配置** 对于Weblogic,可以通过以下方式部署...

    WebSphere6.1与SSH2+JPA2不兼容问题解决

    这种方式会将新版本的AspectJ加载到JDK应用程序类装载器的类路径下,从而解决兼容性问题。 #### 四、总结 通过上述方法,可以有效解决WebSphere 6.1与SSH2+JPA2架构之间的兼容性问题。在实际操作中,需要注意备份...

    WebSphere Portal Express v6.1 –RedHat Linux EE 5 上的安裝練習

    - WAS 6.1、Portal 6.1 和 DB2 9.1.4 将会被安装在此路径下。 - Profile 目录将位于 `/opt/IBM/WebSphere` 下。 5. **主机名检测**: - 系统会检测主机名称(节点名和 FQDN)。 - 如果没有正确配置,请通过 Linux...

    IBM Websphere 6.1 linux 3 安装图解

    进入包含这两个文件夹的目录,然后执行`./WAS/install`启动WebSphere 6.1的安装过程。 3. **安装流程**: - 同意许可协议并点击下一步。 - 接下来的几个步骤可能涉及配置选项,如安装位置、组件选择等,根据提示...

    Security in WAS V61

    2. **Java安全**:J2EE环境下的安全措施,涵盖类加载器、代码签名等。 3. **WebSphere安全**:WAS特有的安全功能,比如用户注册、授权管理等。 ### 安全集成场景 文档中详细讨论了多种安全集成场景,例如SPNEGO...

    eclipse与was(websphere)6.0结合

    本文主要介绍如何在Eclipse中配置WebSphere 6.1,包括服务器的启动、日志查看以及类自动加载功能的实现。 #### 二、准备工作 在开始配置前,请确保已经安装了以下软件: - Eclipse IDE for Java EE Developers - ...

    WebSphere6.1集群安装配置及部署应用说明

    - 在 WebSphere 控制台中设置正确的类加载器方式。 通过上述步骤,可以顺利完成 WebSphere 6.1 集群的安装配置以及应用程序的部署工作,同时解决了常见的乱码和日志输出问题。这些步骤为在生产环境中高效稳定地...

    WebSphere6.1+IHS集群环境下的SSL配置方法.pdf

    WebSphere 6.1 + IHS 集群环境下的 SSL 配置方法 本文档介绍了在 WebSphere 6.1 + IHS 集群环境下配置 SSL 的方法。SSL 配置是为了实现客户端认证,确保数据传输的安全性。本文档将详细介绍如何在 IBM HTTP Server ...

    was部署与配置手册

    - **服务管理**:找到并调整 “IBMWebSphereApplicationServerV6.1-regaltec-126c88Node01” 的启动类型,防止系统启动时自动加载 WebSphere 服务。 --- 通过上述步骤,您可以顺利完成 WebSphere 的部署和配置,...

    IBM WebSphere Appication Server 内部学习资料

    你将学习到如何通过WAS管理控制台或Ant脚本进行这些操作,理解部署描述符文件的作用,以及如何处理部署时可能出现的问题,如依赖注入、类加载器策略等。 P06-WASv6.1-Security.rar:安全是任何企业级软件的重要考虑...

    解决WebSphere不支持JDK新特性的问题.doc

    这是因为 WAS6.1 采用 JDK5.0,因此需要设置相应的 JSP 引擎配置参数来解决这个问题。 其中一个重要的参数是 jdkSourceLevel,它是在 WebSphere Application Server V6.1 中引入的支持 JDK 5 的新 JSP 引擎参数。该...

    WebSphere_Application_Server常见问题及解答.pdf

    文档还探讨了在WAS中实现自定义多线程编程和类加载器的可能性,以及在WebSphere应用服务器集群环境中应用程序间的相互访问问题。最后,它讨论了EJB部署代码的生成时机以及Java EE开发的最佳实践。 集群部分,文档为...

    使用RationalSoftwareArchitect配置MDM工作环境及加载项目[汇编].pdf

    【使用Rational Software Architect配置MDM工作环境及加载项目】是一项关键的软件网络技术任务,主要涉及IBM的Rational Software Architect(RSA)工具与Master Data Management(MDM)的集成。以下是对整个过程的...

Global site tag (gtag.js) - Google Analytics