包冲突

几乎上点规模的java系统就会遇到jar冲突,不负责任的讲排除依赖成了每次发布上线前必做的工作。虽然问题的本质都是jar冲突,但是表现上却有很多不同,从NoSuchMethodError,ClassNotFoundException到field找不到,作用域错误;并且触发冲突条件也不相同,最好并且最常见的是在应用启动时抛出异常,比较恶心的是运行时是某些特殊的边界条件下抛出异常特别。

在某些领域,某些境界提出问题,发现问题比解决问题具有更高的价值,但应用开发显然不属于这种高端领域,对于一般的jar冲突我的做法如下。

  1. 查看log中的异常堆栈信息,在idea中CTRL+N,一般会发现多个类。
  2. 如果1搞不定,可以加入jvm参数-verbose:class,log里会打印出类的加载信息。
  3. 确定jar包名,执行mvn dependency:tree>tree.log。
  4. 如果是lib中的包冲突就排除相应的jar。
  5. 如果不能exclusion,声明一个路径最短,最靠前的dependency。告诉maven,畜生!用这个版本的jar。
  6. 如果是容器||中间件的包和应用lib包冲突,就升级容器||中间件。

inode

在jar冲突中有一种情况就是开发/日常是没问题的,生产环境存在冲突,甚至是生产环境中一部分机器存在冲突,这个是因为tomcat等容器的classLoader加载顺序是不排序的,依赖于底层文件系统的顺序,具体到*nix中就是inode的顺序,每个inode中保存了文件系统的一个文件对象的元信息存储,简单的将就是文件在扇区中的索引值。

可以使用 ls -li 和 stat查看inode,鉴于安全等原因以免引起不必要的麻烦,就不截图了。

finally

实际上大部分的jar都是向后兼容的,如果maven能够按照最高版本依赖(其实也是有问题的),而不是最短路径依赖,相信这个问题会好很多。实际开发中,可以使用maven的依赖冲突检测插件进行事先排除;也可以在部署的lib中查找下进行事后处理;有些发布系统会提前告知本次发布相比与上次新增了那些jar,删除了那些jar,这是一个比较好的策略,毕竟更简单的方法具有更好的执行性。

jar包冲突与inode的更多相关文章

  1. 重新看待Jar包冲突问题及解决方案

    Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版本而导致,可采用依赖排除.依赖管理 ...

  2. 万恶的jar包冲突

    搭了个spring+struts2+mybatis的项目架子, 好久不用myEclipse和tomcat了,生疏了好多. 建议还是去百度一些框架整合的博客,直接使用博客里面给的jar包列表里的jar包 ...

  3. cxf spring restful 问题解决(jar包冲突)

    SEVERE: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error ...

  4. 为什么项目的jar包会和tomcat的jar包冲突?

    为什么项目的jar包会和tomcat的jar包冲突? 碰到这个问题,猜测tomcat启动时会将自己的lib和项目的lib在逻辑上归并为一个大的lib,但是并没有做版本区分以及去重,这样相同的包可能就有 ...

  5. weblogic与axis2 jar包冲突

    1.org.springframework.web.util.NestedServletException: Handler processing failed; nested exception i ...

  6. java.lang.NoSuchMethodError: 属于jar包冲突

    今天测试接口,出错:java.lang.NoSuchMethodError: org.apache.http.entity.mime.content.StringBody.<init>(L ...

  7. Maven 解决JAR包冲突

    在JAR 冲突的情况下, 利用Eclipse方式解决JAR包冲突时比较方便简洁的,步骤如下 1. 在Eclipse 中打开pom.xml , 选择  “Dependency  Hierarchy” 2 ...

  8. sbt公布assembly解决jar包冲突 deduplicate: different file contents found in the following

    一个.问题定义 近期使用sbt战斗assembly发生故障时,包,在package什么时候,发生jar包冲突/文件冲突,两个相同class来自不同jar包classpath内心冲突. 有关详细信息:我 ...

  9. 如何解决使用Gradle时出现的jar包冲突

    前言 在我之前使用Gradle的博文中已经提到,Gradle对依赖的管理是比较智能的,如果有两个包依赖于相同的包,而版本不同的时候,Gradle会进行自动的选择,从而避免jar包的冲突. 也就是说,在 ...

随机推荐

  1. KiKi's K-Number

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  2. Windows下命令(bat可用)

    转自 http://blog.csdn.net/CDersTeam/article/details/51346911 gpedit.msc-–组策略 2. sndrec32---录音机 3. Nslo ...

  3. AngularJS学习篇(八)

    AngularJS 服务(Service) 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 为什么使用服务? ...

  4. SVN提交文件的时候过滤指定文件

    如果使用TortoiseSVN作为客户端的话,可以在TortoiseSVN右键菜单中的 "设置"(settings)--常规设置(General)--全局忽略样式里设置(Globa ...

  5. 万年历java

    public void showTime(){/*万年历 :  1900年1月20号是星期几?1月1号是星期一1月8号是星期一1月15号是星期一1%7 = 18%7 = 115%7 = 1★: 1. ...

  6. Java实现归并排序和快速排序

    参考http://blog.csdn.net/morewindows/article/details/6684558和http://developer.51cto.com/art/201206/344 ...

  7. RabbitMQ之路由

    为了实现一个新功能:只订阅消息的一个子集,例如只需要把严重的错误日志信息写入日志文件(存储到磁盘上),但同时仍然把所有的日志信息输出到控制台中. 绑定(Bindings) 创建绑定 channel.q ...

  8. 四、VueJs 填坑日记之搭建Axios接口请求工具

    上一章,我们认识了项目的目录结构,以及对项目的目录结构做了一些调整,已经能把项目重新跑起来了.今天我们来搭建api接口调用工具Axios.Vue本身是不支持ajax调用的,如果你需要这些功能就需要安装 ...

  9. Android WebView 上传各种文件(包括拍照 录像 录音 文件 音乐 等,用到图片或拍照的,可以参考下)

    我也是从网上扒下来的,经过多次实验,找到了个好用的.网上能搜到最多的也就是这个解决方案,我英文不好,也没仔细研究,但大多数都是出自这: http://stackoverflow.com/questio ...

  10. jfinal 源码学习

    源由 最近闲来无事,顺带看了下jfinal的源码,以下均为自己的个人理解,如有错误请指定: jfinal 使用 在web.xml中配置JfinalFilter 并定义JfinalConfig的类 自定 ...