jar包冲突与inode
包冲突
几乎上点规模的java系统就会遇到jar冲突,不负责任的讲排除依赖成了每次发布上线前必做的工作。虽然问题的本质都是jar冲突,但是表现上却有很多不同,从NoSuchMethodError,ClassNotFoundException到field找不到,作用域错误;并且触发冲突条件也不相同,最好并且最常见的是在应用启动时抛出异常,比较恶心的是运行时是某些特殊的边界条件下抛出异常特别。
在某些领域,某些境界提出问题,发现问题比解决问题具有更高的价值,但应用开发显然不属于这种高端领域,对于一般的jar冲突我的做法如下。
- 查看log中的异常堆栈信息,在idea中CTRL+N,一般会发现多个类。
- 如果1搞不定,可以加入jvm参数-verbose:class,log里会打印出类的加载信息。
- 确定jar包名,执行mvn dependency:tree>tree.log。
- 如果是lib中的包冲突就排除相应的jar。
- 如果不能exclusion,声明一个路径最短,最靠前的dependency。告诉maven,畜生!用这个版本的jar。
- 如果是容器||中间件的包和应用lib包冲突,就升级容器||中间件。
inode
在jar冲突中有一种情况就是开发/日常是没问题的,生产环境存在冲突,甚至是生产环境中一部分机器存在冲突,这个是因为tomcat等容器的classLoader加载顺序是不排序的,依赖于底层文件系统的顺序,具体到*nix中就是inode的顺序,每个inode中保存了文件系统的一个文件对象的元信息存储,简单的将就是文件在扇区中的索引值。
可以使用 ls -li 和 stat查看inode,鉴于安全等原因以免引起不必要的麻烦,就不截图了。
finally
实际上大部分的jar都是向后兼容的,如果maven能够按照最高版本依赖(其实也是有问题的),而不是最短路径依赖,相信这个问题会好很多。实际开发中,可以使用maven的依赖冲突检测插件进行事先排除;也可以在部署的lib中查找下进行事后处理;有些发布系统会提前告知本次发布相比与上次新增了那些jar,删除了那些jar,这是一个比较好的策略,毕竟更简单的方法具有更好的执行性。
jar包冲突与inode的更多相关文章
- 重新看待Jar包冲突问题及解决方案
Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版本而导致,可采用依赖排除.依赖管理 ...
- 万恶的jar包冲突
搭了个spring+struts2+mybatis的项目架子, 好久不用myEclipse和tomcat了,生疏了好多. 建议还是去百度一些框架整合的博客,直接使用博客里面给的jar包列表里的jar包 ...
- cxf spring restful 问题解决(jar包冲突)
SEVERE: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error ...
- 为什么项目的jar包会和tomcat的jar包冲突?
为什么项目的jar包会和tomcat的jar包冲突? 碰到这个问题,猜测tomcat启动时会将自己的lib和项目的lib在逻辑上归并为一个大的lib,但是并没有做版本区分以及去重,这样相同的包可能就有 ...
- weblogic与axis2 jar包冲突
1.org.springframework.web.util.NestedServletException: Handler processing failed; nested exception i ...
- java.lang.NoSuchMethodError: 属于jar包冲突
今天测试接口,出错:java.lang.NoSuchMethodError: org.apache.http.entity.mime.content.StringBody.<init>(L ...
- Maven 解决JAR包冲突
在JAR 冲突的情况下, 利用Eclipse方式解决JAR包冲突时比较方便简洁的,步骤如下 1. 在Eclipse 中打开pom.xml , 选择 “Dependency Hierarchy” 2 ...
- sbt公布assembly解决jar包冲突 deduplicate: different file contents found in the following
一个.问题定义 近期使用sbt战斗assembly发生故障时,包,在package什么时候,发生jar包冲突/文件冲突,两个相同class来自不同jar包classpath内心冲突. 有关详细信息:我 ...
- 如何解决使用Gradle时出现的jar包冲突
前言 在我之前使用Gradle的博文中已经提到,Gradle对依赖的管理是比较智能的,如果有两个包依赖于相同的包,而版本不同的时候,Gradle会进行自动的选择,从而避免jar包的冲突. 也就是说,在 ...
随机推荐
- JavaScript instanceof 运算符深入剖析【转载】
http://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/ instanceof 运算符简介 在 JavaScript ...
- n! 进制
n! 进制 Time limit per test: 1.0 seconds Time limit all tests: 1.0 seconds Memory limit: 256 megabytes ...
- 使用jquery ajaxForm提交表单
一.首先引用Jquery <script src="~/Scripts/jquery-1.9.1.min.js"></script> <script ...
- 基于HTML5的WebGL经典3D虚拟机房漫游动画
第一人称在 3D 中的用法要参考第一人称在射击游戏中的使用,第一人称射击游戏(FPS)是以第一人称视角为中心围绕枪和其他武器为基础的视频游戏类型 ; 也就是说,玩家通过主角的眼睛来体验动作.自从流派开 ...
- 最大流——Dinic算法
前面花了很长时间弄明白了压入-重标记的各种方法,结果号称是O(V3)的算法测demo的时候居然TLE了一个点,看了题解发现所有人都是用Dinic算法写的,但它的复杂度O(V2E)明显高于前者,具体是怎 ...
- Linux系列教程(二十)——Linux的shell概述以及如何执行脚本
从这篇博客开始,我们将进入Linux的shell脚本的学习,这对于Linux学习爱好者而言是特别重要的一节,也是特别有意思的一节,shell 脚本就像我们知道的Java,php类似的编程语言一样,通过 ...
- Gmail,QMail,163邮箱的 IMAP/SMTP/POP3 地址
我们在客户端设置邮箱或者使用 PHPMailer 发送邮件的时候,我们都会去查找这些邮箱的 IMAP/SMTP/POP3 地址,这里就列出 Gmail, QMail, 163邮箱这三个常用邮箱的这些地 ...
- Spark之MapReduce原理
参考http://www.cnblogs.com/wuyudong/p/mapreduce-principle.html MapReduce 我们来拆开看: Mapping(映射)对集合里的每个目 ...
- CentOS 6.4安装配置LNMP服务器(Nginx+PHP+MySQL)
一 安装篇 1. 安装nginx yum check-update #更新yum源 yum remove httpd* php* #删除系统自带的软件包 yum install nginx #安装ng ...
- ZZCMS8.1|代码审计
这周的审计任务 ZZCMS8.1是站长招商网内容管理系统.审计这个CMS的原因很多,这里就不详说了(其实是漏洞类型多点) ...