技术开发 频道

一次WebSphere类加载问题的错误诊断

【IT168 专稿】    开发人员使用开源项目在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应用,选择“类装入和更新检测”,选择“类已装入并且是先使用应用程序类装入器”如下图:

    重启应用,必要时重启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步。

0