开发人员使用开源项目在Tomcat上进行开发
然后在生产环境中使用WebSphere应用服务器 target=_blank>服务器(WAS)部署时
有时会遇到在Tomcat上开发的应用在WAS上不能运行的情况
其中相当一部分错误是因为类加载的问题
有一次接到用户电话
反映使用JSF开发的应用
在WAS上不能正常运行
到用户现场
发现开发人员使用myfaces开源项目在tomcat上进行开发
部署到WAS上时
页面不能正常显示
检查WAS日志SystemOut
log和SystemErr
log以及应用自身的日志
没有发现有意义的信息
遇到此类问题时
如果对开源项目或 应用内部运行机制不太了解
可以大致按下列思路进行错误诊断
.首先先尝试更改应用的类加载路径
WAS的类加载原理请参见后面列出的参考资料
如果是xxxwar应用在部署到WAS后登陆WAS管理控制台选择应用程序/xxx_war应用选择管理模块选择相应的war模块默认的类装入器顺序为类已装入并且是先使用父类装入器更改类装入器顺序为类已装入并且是先使用应用程序类装入器
如下图
src=http://imgeducitycn/img_///jpg>
如果安装的应用是xxxear应用特别是有一些公用的utility jar位于ear级别则除了按照上面步骤更改war模块(也称为web模块)的类装入器顺序之外还要更改ear级别的类装入器顺序选择应用程序/xxx应用选择类装入和更新检测选择类已装入并且是先使用应用程序类装入器如下图
src=http://imgeducitycn/img_///jpg>
src=http://imgeducitycn/img_///jpg>
重启应用必要时重启WAS测试页面是否正常显示
.如果还是不能正常显示则查看应用特别是开源项目使用的utility jar包通常位于ear目录级别或者xxxwar/WEBINF/lib目录下删除掉一些常见的WAS已有的且必须使用WAS自带的jar包如jeejar支持JSP等运行的jar等(此类问题SystemOutlog或者SystemErrlog中通常会报错)如果自己无法判断则略过此步本次错误诊断中检查客户应用发现WEBINF/lib目录中jar包数量众多且客户除了使用myfaces还有其他大量开源项目不能明确断定有问题的与WAS沖突的jar包
.到/support以及googlebaidu上搜索关键字JSFmyfacesWebSphere得到一些建议
Apache Tomahawk configuration error with Apache MyFaces and WebSphere Application Server and :
_US&cs=utf&cc=us&lang=en
Using MyFaces JSF and WebSphere Application Server V and V:
_US&cs=utf&cc=us&lang=en
sitemeshmyfacesrichfaces的集成解决方案
按照搜到的建议操作页面仍无法显示为了分离错误缩小诊断范围进行第步
.到myfaces项目网站下载与客户应用同一版本的最简单的sample应用myfacesexamplesimplewar在WAS上安装进行测试页面无法显示进行第步更改类加载路径也无法显示检查myfacesexamplesimplewar的lib目录删除掉xmlapisbjar和xmlParserAPIsjar包运行成功
.回到客户应用删除掉xmlapisbjar和xmlParserAPIsjar更改类加载路径页面正常显示
.如果实际诊断中能够明确断定是某个类的加载出了问题可以打开详细类装入选择应用程序服务器/server/进程定义/Java虚拟机选择详细类装入如下图
src=http://imgeducitycn/img_///jpg>
重启WAS之后在native_stderrlog中可以看到类的加载信息例如
class load: orgapachetaglibsstandardtlvJstlBaseTLV from: file:/D:/Program/was/AppServer/profiles/TestProfile/installedApps/wdanNodeCell/myfacesexamplesimple___warear/myfacesexamplesimplewar/WEBINF/lib/jstljar
如果还需要类加载的更详细信息可以在诊断跟蹤中设置 *=info: comibmwsclassloader*=all具体做法为登陆管理控制台左边导航树选择故障诊断/日志和跟蹤然后在右面区域选择进程名(单机环境通常为server)/诊断跟蹤然后选择更改日志详细信息级别设置*=info: comibmwsclassloader*=all保存
src=http://imgeducitycn/img_///jpg>
src=http://imgeducitycn/img_///jpg>
重启WAS在profile_root/logs/server/tracelog中就可以看到类加载的详细信息例如
>loadClass name=llaboratorPortletServletCollaborator
…
comibmwsclassloaderCompoundClassLoader@ff
Local ClassPath: D:\Program\was\AppServer\systemApps\iscliteear\strutsjar;
…
Delegation Mode: PARENT_FIRST
[ ::: CST] a CompoundClass <loadClass Exit
需要注意的是开源项目为应用开发节省了很多工作量但开发人员使用开源项目时最好对该开源项目的运行机制代码以及要使用的应用服务器类加载机制有较好的理解以便于错误诊断