黑马程序员技术交流社区

标题: 解决服务器jar包冲突的4种方法 [打印本页]

作者: 裙下之臣    时间: 2014-9-10 18:08
标题: 解决服务器jar包冲突的4种方法
在开发测试时一切正常, 一旦部署到正式服务器上, 就会出现以下几类异常:
1, java类找不到 java.lang.ClassNotFoundException
2, 方法不存在 java.lang.NoSuchMethodError
3, 字段不存在 java.lang.NoSuchFieldError
4, 类错误 java.lang.LinkageError

原因
war包中jar包和服务器上jar包冲突, 由于现在服务器功能越来越强大, 而引入的jar也在不断增加,
出现的冲突的可能性也越来越大, 而且正式环境复杂, 而且不能轻易修改服务器相关配置,
为解决jar包冲突的问题带来困难, 如果去解决过这些问题, 那是相当折腾人的, 下面是一些方法的总结
根本
这类冲突根本原因就是: 同一个java类存在多个jar包或类路径中, 而这大多由于使用了不同jar包版本造成.
方法
1, 案例法
使用服务器上已有应用的jar包(前提:服务器上面已经部署过别的应用), 曾经使用过此方法解决冲突
2, 最小化法
正式环境有很多限制, 上传,部署,启停,测试这些过程越简单越好, 最近一次把war包中137jar删除只剩下14个jar包,
整个测试验证周期大大缩短
3, 来源法
如果能知道类加载于哪个jar包, 解决就比较容易, 在异常中会有出错类的完整类名,
如果能获取此类加载于那个jar包, 就能确认冲突的jar包,
如何知道class加载于那个jar包, 昨天灵机一动想到了一个方法, 其实也很简单, 代码如下:
clazz.getResource(“className.class”).toString();
后面有一个jsp专门获取class加载于那个jsp包, 可供下载使用.
4, 服务器分析法
了解各种应用服务器的class加载机制, 就能判断是什么原因, 什么时候导致的冲突, 这样可以通过调整class加载顺序解决,
最近一次WAS服务器上的jar包冲突就此方法解决.



作者: 不轻易    时间: 2014-9-10 18:21
学习学习,感谢分享啊
作者: ItJack    时间: 2014-9-11 09:32
赞一个,学习了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2