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模块或者应用程序服务器指派多个共享库。 在应用程序级别使用共享库 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与她联系。
定义一个名为VersionCheckerV2_SharedLib 的共享库,并把它跟ClassloaderTest 应用程序关联起来,步骤如下:
共享库也可以跟应用程序服务器关联起来。在这个服务器上的部署的所有应用程序都能够看到共享库的代码列表。要把共享库跟应用程序服务器关联起来,首先要为应用程序服务器创建一个附加的类加载器,步骤如下:
发表评论
-
控制台SESSIONOUT
2010-09-17 13:04 1106通过配置文件来修改WAS控制台Session过期时间的方法 ... -
SOCKET 异常类型
2010-03-30 16:42 1711Error code Meaning ... -
Transaction Introduce
2010-03-30 14:01 1082Transaction 什么是Transaction? ... -
DB2 死锁
2010-03-26 10:33 4186解决“SQL0911N 因为死锁 ... -
WAS 事物引起的错误
2010-03-25 17:13 2416一、性能故障的现 ... -
案例分析
2010-03-16 16:53 1549系统上线后偶有宕机, ... -
Remote Rendering portlet hangs on socketRead0()
2010-03-16 16:46 1911当我们在JAVACORE文件中发现很多WEBCONTAINER ... -
WAS Portal Theme Development And Configuration
2010-03-12 22:37 1274我们先介绍一下主题和 ... -
Portal 主题部署
2010-03-12 22:21 1336部署定制的主题和外 ... -
应用服务器出现错误的原因简析
2010-03-11 22:19 842磁盘已满 导致 ... -
WAS 中Too many open files问题
2010-03-11 22:16 1227WAS下的应用系统,在对其他性能开至较大时出现系统无法返回的情 ... -
急性者的性能优化
2010-03-05 11:02 849引言 如果您是这样一个人:启动并运行 WebSphere ... -
控制台安全性破解
2010-03-04 23:05 917常在河边走,哪有不湿鞋,WebSphere管理中最让人 ... -
查看WAS版本
2010-03-04 22:39 2575一、查看WAS版本的方式:1、命令行 cd $WAS_HOM ... -
WAS设置编码方式
2010-03-04 22:29 4336当安装了webSphere的小型机的默认编码不是GBK ... -
WAS的类加载机制三
2010-03-04 12:34 135612.3.1 类加载策略 ... -
WAS的类加载机制二
2010-03-04 12:33 86512.2 概览Websphere 类加载器 注意:每一个 ... -
WAS的类加载机制一(包含JVM的类加载机制.转载)
2010-03-04 12:29 1050abstract:本文截取IBM 红皮书《WebSpher ...
相关推荐
eclipse与Websphere 6.1进行紧密合作、并实现在eclipse中进行was的启动和日志查看、并实现类自动加载。
安卓上用于加载的Webview视图窗口只是作为类浏览器而存在,在安卓上更是只能同时运行一个Webview。(2)跨域数据交互问题。不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备...
4、PORTAL6.1.0.3无法查找任何的用户或用户组 92 5、如何个性化PORTLET添加控制板 93 6、IBM WCM中匿名搜索 94 7、开发一个系统登录的PORTLET 95 8、WEBSPHERE PORTAL调整PORTLET之间的间隙 102 9、PORTAL6.1.0.1...
This translation was done by MySQL partner GreatLinux, Beijing, People's Republic of China. GreatLinux Inc. 北京万里开源软件有限公司在全国范围提供MySQL产品相关的商务及 技术方面的咨询与支持服务。垂询请...