解决服务器jar包冲突的4种方法
解决服务器jar包冲突的4种方法
yizhichao 发表于11个月前
解决服务器jar包冲突的4种方法
  • 发表于 11个月前
  • 阅读 133
  • 收藏 1
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

现象

在开发测试时一切正常, 一旦部署到正式服务器上, 就会出现以下几类异常:


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包冲突就此方法解决.



附录
深入探讨 Java 类加载器 http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 
如何在 WebSphere 中解决 jar 包冲突 http://www.ibm.com/developerworks/cn/websphere/library/techarticles/haoaili/0512/
 

附件
class来源那个jar包的jsp 下载路径: http://pan.baidu.com/share/link?shareid=1635172140&uk=1963494373


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

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
yizhichao
粉丝 10
博文 340
码字总数 271925
×
yizhichao
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: