was8.5.0.1jar包冲突报错("*** incompatible with ***")及db2数据源问题:“操作无效:已关闭result set,errorcode=-4470
最近开发环境的was集群出现了问题,运维人员粗暴的铲掉了所有的环境,然后新建了集群。。。
接下来的部署过程中遇到了不少问题,记录下来,方便自己,方便有需要的朋友
1,was版本:8.5.0.1,数据库配置为jndi方式
问题1:
在集群上部署项目war包后启动过程中,服务器、各节点在was前端页面没有任何提示,但浏览器访问项目路径时,提示”网页找不到“,猜测时was启动时遇到了问题。
在查看了was的日志后(路径:/IBM/WebsPhere/AppServer/profiles/Appserv02/logs/节点名称/SystemOut.log、SystemErr.log),在SystemOut.log日志中看到这样一句:
这句错误的上方有一句:
按照这句的路径,在/ffdc下找到对应txt文件:14.09.25.4035850266934009384917.txt,可以看到详细错误信息:
找到这里,原因出来了,war包中的jar包和was中的jar包冲突导致,项目中使用的QuartzInitializerServlet和javax的Servlet相矛盾
网上有几种解决办法,
1,共享库(https://blog.csdn.net/zhengjl369/article/details/78249276)2,类加载顺序配置,3,其他的未详细了解。
因为项目权限控制比较严,我没有新建共享库等敏感操作和修改db2数据库设置并重启数据库的权限。。。
所以采用了2的解决办法(在做另一个项目时当时也遇到jar包冲突):
a,修改war程序的类加载顺序为图中所示:
b,修改war的”类装入和更新检测“为图中所示:
注意:应先尝试勾选的组合1为:类装入器顺序:勾选第二个;war类装入器策略:勾选第二个;然后启动war程序,测试访问结果(此种组合在另一项目中解决了问题)
若仍失败,日志中仍显示war包冲突,采用下图组合2方式:即:勾选第一个,勾选第二个(本项目解决问题)
启动war程序,浏览器测试,系统首页访问成功;
小结:
java应用启动过程中,有一个固定的类加载过程,如先加载jdk中的jar包,后为class文件,然后为webinfo下lib中的jar包(视项目具体情况),was的类加载顺序可在控制台查看:
对于冲突的jar包,解决原则就是,分开加载,共享库也好,类加载顺序调整也一样,都是避免相冲突的jar包加载过程中冲突,导致加载失败;
问题2:在修复了war启动报错后,登陆时提示登陆失败。。。
在查看了was的SystemErr.log文件后,发现这样一句错误:
多方搜索,确定问题为数据源配置问题,涉及到db2的边界事务情景:
解决方法:https://jingyan.baidu.com/article/63acb44ac0fb5061fdc17e5c.html
最终,把was和数据源的坑填好了。。。