WebSphere类加载问题的错误诊断

日期: 2010-01-03 作者:吴丹 来源:TechTarget中国 英文

    开发人员使用开源项目在Tomcat上进行开发,然后在生产环境中使用WebSphere应用服务器(WAS)部署时,有时会遇到在Tomcat上开发的应用在WAS上不能运行的情况,其中相当一部分错误是因为类加载的问题。有一次接到用户电话,反映使用JSF开发的应用,在WAS上不能正常运行。到用户现场,发现开发人员使用myfaces开源项目在tomcat上进行开发,部署到WAS上时,页面不能正常显示。检查WAS日志SystemOut.log和SystemErr.log以及应用自身的日志,没有发现有意义的信息。遇到此类问题时,如果对开源项目或 应用内部运行机制不太了解,可以大致按下列思路进行错误诊断:

  1.首先先尝试更改应用的类加载路径:

  WAS的类加载原理请参见后面列出的参考资料。

  如果是xxx.war应用,在部署到WAS后,登陆WAS管理控制台,选择应用程序/xxx_war应用,选择“管理模块”,选择相应的.war模块,默认的类装入器顺序为“类已装入并且是先使用父类装入器”,更改“类装入器顺序”为“类已装入并且是先使用应用程序类装入器”。

  如下图:

应用程序类装入器

  如果安装的应用是xxx.ear应用,特别是有一些公用的utility jar位于ear级别,则除了按照上面步骤更改war模块(也称为web模块)的类装入器顺序之外,还要更改ear级别的类装入器顺序:选择应用程序/xxx应用,选择“类装入和更新检测”,选择“类已装入并且是先使用应用程序类装入器”如下图:

类装入和更新检测

1

  重启应用,必要时重启WAS,测试页面是否正常显示。

  2.如果还是不能正常显示,则查看应用特别是开源项目使用的utility jar包,通常位于ear目录级别,或者xxx.war/WEB-INF/lib目录下,删除掉一些常见的WAS已有的且必须使用WAS自带的jar包,如j2ee.jar,支持JSP等运行的jar等(此类问题SystemOut.log或者SystemErr.log中通常会报错)。如果自己无法判断,则略过此步。本次错误诊断中,检查客户应用,发现WEB-INF/lib目录中jar包数量众多,且客户除了使用myfaces、还有其他大量开源项目,不能明确断定有问题的与WAS冲突的jar包。

  3.到www.ibm.com/support以及google、baidu上搜索关键字JSF、myfaces、WebSphere,得到一些建议:

  Apache Tomahawk configuration error with Apache MyFaces and WebSphere Application Server 6.0 and 6.1:

  http://www-01.ibm.com/support/docview.wss?rs=0&q1=myfaces&uid=swg21291065&loc=en_US&cs=utf-8&cc=us&lang=en

  Using MyFaces JSF and WebSphere Application Server V6.0 and V6.1:

  http://www-01.ibm.com/support/docview.wss?rs=0&q1=myfaces&uid=swg21243668&loc=en_US&cs=utf-8&cc=us&lang=en

  sitemesh、myfaces、richfaces的集成解决方案:

  http://www.javaeye.com/topic/127703

  按照搜到的建议操作,页面仍无法显示,为了分离错误,缩小诊断范围,进行第4步。

  4.到myfaces项目网站http://myfaces.apache.org/,下载与客户应用同一版本的最简单的sample应用myfaces-example-simple-1.1.9.war,在WAS上安装进行测试,页面无法显示,进行第1步更改类加载路径也无法显示。检查myfaces-example-simple-1.1.9.war的lib目录,删除掉xml-apis-1.0.b2.jar和xmlParserAPIs-2.0.2.jar包,运行成功。

  5.回到客户应用,删除掉xml-apis-1.0.b2.jar和xmlParserAPIs-2.0.2.jar,更改类加载路径,页面正常显示。

  6.如果实际诊断中,能够明确断定是某个类的加载出了问题,可以打开“详细类装入”:选择“应用程序服务器/server1/进程定义/Java虚拟机”,选择“详细类装入”如下图:

详细类装入

  重启WAS之后,在native_stderr.log中,可以看到类的加载信息,例如:

以下是引用片段:
class load: org.apache.taglibs.standard.tlv.JstlBaseTLV from: file:/D:/Program/was61/AppServer/profiles/TestProfile/installedApps/wdanNode02Cell/myfaces-example-simple-1_1_9_war.ear/myfaces-example-simple-1.1.9.war/WEB-INF/lib/jstl-1.2.jar

  如果还需要类加载的更详细信息,可以在诊断跟踪中设置 *=info: com.ibm.ws.classloader.*=all,具体做法为:登陆管理控制台,左边导航树选择“故障诊断/日志和跟踪”,然后在右面区域选择进程名(单机环境通常为server1)/诊断跟踪,然后选择“更改日志详细信息级别”,设置“*=info: com.ibm.ws.classloader.*=all”,保存。

保存

重启

  重启WAS。在profile_root/logs/server1/trace.log中,就可以看到类加载的详细信息。例如:

以下是引用片段:
> loadClass name=com.ibm.isclite.container.collaborator.PortletServletCollaborator

com.ibm.ws.classloader.CompoundClassLoader@3f603f6
   Local ClassPath: D:Programwas61AppServersystemAppsisclite.earstruts.jar;
   …
  Delegation Mode: PARENT_FIRST
[09-12-31 11:39:18:671 CST] 0000000a CompoundClass < loadClass Exit

  需要注意的是,开源项目为应用开发节省了很多工作量,但开发人员使用开源项目时,最好对该开源项目的运行机制、代码,以及要使用的应用服务器类加载机制有较好的理解,以便于错误诊断。

  参考资料:

  1. WebSphere应用服务器v6.1系统管理红皮书:http://www.redbooks.ibm.com/abstracts/sg247304.html?Open

  2. WebSphere应用服务器v6.1类加载问题诊断红皮书:http://www.redbooks.ibm.com/abstracts/redp4307.html?Open

  3. 类加载机制实践:http://tech.it168.com/a2009/0901/672/000000672382.shtml

  4. Tomcat和Websphere类加载机制。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

吴丹
吴丹

相关推荐