开发人员使用开源项目在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:
Using MyFaces JSF and WebSphere Application Server V6.0 and V6.1:
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中国
作者
相关推荐
-
谁有过配置阿里云服务器tomcat的经验
-
如何在bluemix上部署基于tomcat的java应用
-
Tomcat性能设置两在常见错误
关于Tomcat应用服务器的一件大事是,那用于开发和测试应用的软件同时也是在整个生产环境中安装和使用的软件。
-
合并日志文档操作 优化Tomcat性能
你就应该知道日志的日常检查是关键的活动,但日志的监测却会降低性能,这在Tomcat如何进行性能优化?