web前端

位置:IT落伍者 >> web前端 >> 浏览文章

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


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

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

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

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

               

上一篇:HTML Parser学习 整理常用的解析代码

下一篇:DataGrid Web Control 基本操作