论坛首页 Java企业应用论坛

解决服务器jar包冲突的4种方法

浏览 6466 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-07-12  
现象
在开发测试时一切正常, 一旦部署到正式服务器上, 就会出现以下几类异常:

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包冲突就此方法解决.
附件
class来源那个jar包的jsp 下载路径: http://pan.baidu.com/share/link?shareid=1635172140&uk=1963494373


后记
解决了一个问题,往往还有更大的问题,循环往复。

   发表时间:2014-02-27  
找到是第一步,关键是解决问题。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics