tree 怎么看weblogic jar包冲突突

如何解决包冲突问题_百度知道
如何解决包冲突问题
我有更好的答案
按照你的要求,少咯 3个asm包 asm-3,JAR包应该有12个,asm-tree-3,而是你的JAR包没有导入完全.1;asm-commons-3.1你的不是冲突
先修复最开始提示的依赖关系 apt-get -f install
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁关于Jar包的管理,你有什么想说的吗 - 开源中国社区
当前访客身份:游客 [
当前位置:
对于做Java的同学而言,应用依赖的那一众的Jar如何管理是个大难题,像我们的很多应用动不动就依赖上百个Jar,这些Jar的冲突问题很容易 导致各种奇怪现象,例如有些机器是OK的,有些机器却报NoSuchMethodException等等,说说Jar管理中要解决的几个问题以及现在我们 的解决方法,另外就是也希望能听到大家对这块的建议或者碰到过的问题。
Jar管理中最容易碰到的是这么几个问题: 1. Jar包版本冲突 这是最容易出现的现象,因为应用引用的Jar可能会再依赖其他的Jar,于是这种情况下会变得很不可控,通常来说用maven管理的java工程,在打包 的时候会检查同样groupId和artifactId的依赖有没有出现版本冲突的现象,如果出现会禁止打包,这一定程度上缓解了依赖冲突的问题。
不知道大家碰到过多少那种改了groupId或artifactId,但里面类的包名什么的又没变的现象,反正我是碰过很多次了,对于这种状况Maven 是提供不了什么帮助的,这种状况被发现通常会是由于应用启动或运行的时候报ClassNotFoundException或 NoSuchMethodException,在启动参数上增加-XX:+TraceClassLoading有可能就会发现原来加载到了另外一个 Jar,最龌龊的现象是某些jar把它依赖的jar的类也打包进去了。
Jar包版本冲突的问题绝对是Java应用不好解决的一个点,通常这类问题目前会采用这样一些方法来避免: * 在pom.xml中写依赖的时候exclude掉依赖的某些依赖,避免依赖的依赖带来jar冲突; * 对于实在找不出有冲突的jar是哪里造成的时候(至少我确实碰到过,即使用mvn dependency:tree也没找到),可以在pom.xml中直接写不想打入包中的那个jar的依赖,scope指定为provided,这样可以 实现强制不把这个版本的jar打入包中; * 在打包完成后,解开所有的jar,检查是否有完全同样的类名但类文件内容又不一致的现象,如果有则报错等,这种需要编写一个小的mvn插件来完成,或者也 可以在一个打包脚本中最后用脚本来解决,这种千万不能存在侥幸心理,什么自己机器上是OK的,只要有类版本冲突,就是有可能会出现问题的,之所以在你的机 器不出现只是可能凑巧装载的class是你应用需要的那个。
还有一类Jar包版本冲突问题可能是你的应用和容器的冲突,例如在jboss/tomcat里,尽管通常jboss/tomcat会提供 classloader隔离的机制,但很多时候会出于某些需要关闭,这种时候就很容易导致容器的jar和应用的jar冲突的现象,这种是最不好搞的,因为 只能是覆盖容器的。
ps: 真心希望Java能从语言级更好的解决依赖的问题,否则对于大型应用工程而言,Jar的冲突始终是个不太好处理的问题。
2. SnapShot包的问题 你的生产环境里跑的应用里依赖了多少SnapShot的包呢?这种是很容易造成极高的风险的,因为通常SnapShot的依赖在打包时会直接升级成最新的,而最新的这种有可能是有问题的,如果就这样打包后部署到生产环境,有可能会产生悲催的故障。 前两天我们在发布的时候就碰到过一次这个问题… 我们之前为了避免这类问题,是在打包的时候会检查是否有SnapShot的版本,有的话会禁止打包,但据说后来由于此类依赖太多,就去掉了,但从我们上面碰到的问题可以看到,这种问题是相当严重的…
3. 依赖了老的有bug的版本的Jar的问题 应用里依赖的无论是外部提供的Jar,还是公司内部其他团队提供的Jar,都有可能依赖的是有bug的版本,碰到这样的现象该怎么统一控制呢? 例如发邮件通知所有的开发,某个版本不能用? 通常来说这种通知都是无效的。 我们对于此类问题是写了一个maven插件,在打包时会增加一个依赖的jar包规则,例如当依赖的某个jar时,必须高于某版本,或不等于某版本,如果不符合的话则拒绝打包。 这个方法对一些需要升级jar版本的场景也会有帮助,例如提供的一个老版本的jar,可能希望在3个月后接口全部升级到新接口,于是可以在打包的时候提醒依赖的某个老版本的jar在几个月后会废弃,这样通常对升级会有一些帮助。
关于Jar包的管理,你有什么想说的吗,欢迎回复消息。
from:/?p=156#comment-214
共有2个答案
<span class="a_vote_num" id="a_vote_num_
楼主不知道,你有没有遇到和我一样的问题。就是在写maven插件的时候,插件发布后,不能读取插件本身的properties文件。
<span class="a_vote_num" id="a_vote_num_
重复制造轮子可破。
--- 共有 5 条评论 ---
: (⊙v⊙)嗯
(3年前)&nbsp&
: jar问题,在有java的第一天开始大家就知道了。在开发C++的时候,还有dll噩梦一说,这比java要早很多。
dll跟jar没区别。既然想省事,必须付出代价啊。
如果作为一个公司,想长期延续的在技术上不断发展,搞自己的库肯定是必然之路啊。就像阿里,淘宝,百度一样的。
小公司就尽量的少依赖框架吧。
(3年前)&nbsp&
: 这个量很大吧
(3年前)&nbsp&
: 无耻一点,把用到源代码拆出来,变成自己的包。大家就依赖一个包。参考google的guava
(3年前)&nbsp&
(3年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
工信布的其它问题
类似的话题MAVEN(59)
IDEA(15)
使用maven最烦人的可能就是类包之间的版本冲突引发的问题了,类包冲突的一个很大的原因即产类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,因而可能造成一个我们不想要的类包的载入,严重的甚至会引起类包之间的冲突。&
要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包,然后通过这个类包树找出我们不想要的依赖类包,手工将其排除在外就可以了。&
下面,通过一个例子来说明:&
我的项目使用testng进行测试,使用了untilis,由于unitils的类包会隐式依赖于junit,这是我不想看到的,下面的目的就是找出junit会谁隐式载入了,然后exculte掉它。&
通过idea的maven依赖分析将不需要的依赖exclude掉&
打开maven的pom.xml,在某个&dependency&中通过右键菜单:maven-&show dependency 打开分析的图形化页面,如下所示:&
通过菜单的exclude即解决这个间接依赖。&
通过这个依赖树,我们还可以看到Junit还通过“unitils-spring”的依赖间接载入了,如下所示:&
从上面的依赖树中,我们可以看出junit通过unitils-spring的unitils-database间接引入了,由于我的项目都不需要数据库的测试,因此,可以把unitils-database项整个exclude掉。&
如果有jar包冲突,idea会用红色标明
&鼠标点击冲突状态的图标,会有红色虚线标明是跟哪个jar包冲突了,在其上右键Exclude则可以快速的排除依赖。可见,idea的jar包查看和冲突排除比eclipse 插件要好,但idea下没有找到明显输入名字查找对应jar包的功能,只找到这个,然后输入字母就能够筛选了
下面,是处理完成后的pom.xml关键片断:&
&&&&&&&&org.unitils&&
&&&&&&&&unitils-testng&&
&&&&&&&&${unitils.version}&&
&&&&&&&&test&&
&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&junit&&
&&&&&&&&&&&&&&&&junit&&
&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&org.unitils&&
&&&&&&&&unitils-spring&&
&&&&&&&&${unitils.version}&&
&&&&&&&&test&&
&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&unitils-database&&
&&&&&&&&&&&&&&&&org.unitils&&
&&&&&&&&&&&&&&
&&&&&&&&&&
这样,被间接隐式引入的junit就被我们exclude在外了。&
有时通过idea的依赖分析工具产生的树不够全,这时就需要使用mvn dependency:tree来查看依赖树了。&
通过mvn dependency:tree 查看依赖树&
mvn dependency:tree
以下是使用这个工具产生的依赖树:&
E:\01workspace\chenxh\09research\rop\rop&mvn dependency:tree&
[WARNING]&
[WARNING] Some problems were encountered while building the effective settings&
[WARNING] 'pluginRepositories.pluginRepository.id' must not be 'local', this identifier is reserved for the local re&
tory, using it for other repositories will corrupt your repository metadata. @ C:\Users\Administrator\.m2\settings.x&
[WARNING]&
[INFO] Scanning for projects...&
[INFO] ------------------------------------------------------------------------&
[INFO] Building rop 1.0-SNAPSHOT&
[INFO] ------------------------------------------------------------------------&
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ rop ---&
[INFO] com.rop:rop:jar:1.0-SNAPSHOT&
[INFO] &#43;- javax.validation:validation-api:jar:1.0.0.GA:compile&
[INFO] &#43;- org.hibernate:hibernate-validator:jar:4.2.0.Final:compile&
[INFO] &#43;- org.codehaus.jackson:jackson-core-asl:jar:1.9.5:compile&
[INFO] &#43;- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.5:compile&
[INFO] &#43;- org.codehaus.jackson:jackson-jaxrs:jar:1.9.5:compile&
[INFO] &#43;- org.codehaus.jackson:jackson-xc:jar:1.9.5:compile&
[INFO] &#43;- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.0.0-RC2:compile&
[INFO] |& &#43;- com.fasterxml.jackson.core:jackson-core:jar:2.0.0-RC2:compile&
[INFO] |& &#43;- com.fasterxml.jackson.core:jackson-annotations:jar:2.0.0-RC2:compile&
[INFO] |& &#43;- com.fasterxml.jackson.core:jackson-databind:jar:2.0.0-RC2:compile&
[INFO] |& &#43;- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.0.0-RC2:compile&
[INFO] |& \- org.codehaus.woodstox:stax2-api:jar:3.1.1:compile&
[INFO] |&&&& \- javax.xml.stream:stax-api:jar:1.0-2:compile&
[INFO] &#43;- org.slf4j:slf4j-api:jar:1.6.1:compile&
[INFO] &#43;- org.slf4j:slf4j-log4j12:jar:1.6.1:compile&
[INFO] &#43;- log4j:log4j:jar:1.2.16:compile&
[INFO] &#43;- org.springframework:spring-core:jar:3.1.1.RELEASE:compile&
[INFO] |& &#43;- org.springframework:spring-asm:jar:3.1.1.RELEASE:compile&
[INFO] |& \- commons-logging:commons-logging:jar:1.1.1:compile&
[INFO] &#43;- org.springframework:spring-context:jar:3.1.1.RELEASE:compile&
[INFO] |& &#43;- org.springframework:spring-aop:jar:3.1.1.RELEASE:compile&
[INFO] |& &#43;- org.springframework:spring-beans:jar:3.1.1.RELEASE:compile&
[INFO] |& \- org.springframework:spring-expression:jar:3.1.1.RELEASE:compile&
[INFO] &#43;- org.springframework:spring-context-support:jar:3.1.1.RELEASE:compile&
[INFO] &#43;- org.springframework:spring-web:jar:3.1.1.RELEASE:compile&
[INFO] |& \- aopalliance:aopalliance:jar:1.0:compile&
[INFO] &#43;- org.springframework:spring-test:jar:3.1.1.RELEASE:compile&
[INFO] &#43;- org.springframework:spring-webmvc:jar:3.1.1.RELEASE:compile&
[INFO] &#43;- org.testng:testng:jar:6.3:test&
[INFO] |& &#43;- org.beanshell:bsh:jar:2.0b4:test&
[INFO] |& &#43;- com.beust:jcommander:jar:1.12:test&
[INFO] |& \- org.yaml:snakeyaml:jar:1.6:test&
[INFO] &#43;- org.mockito:mockito-all:jar:1.8.5:test&
[INFO] &#43;- javax.servlet:servlet-api:jar:2.5:provided&
[INFO] &#43;- org.unitils:unitils-core:jar:3.3:test&
[INFO] |& &#43;- commons-lang:commons-lang:jar:2.3:test&
[INFO] |& &#43;- commons-collections:commons-collections:jar:3.2:test&
[INFO] |& \- ognl:ognl:jar:2.6.9:test&
[INFO] &#43;- org.unitils:unitils-testng:jar:3.3:test&
[INFO] |& \- org.testng:testng:jar:jdk15:5.8:test&
[INFO] |&&&& \- junit:junit:jar:3.8.1:test&
[INFO] \- org.unitils:unitils-spring:jar:3.3:test&
[INFO]&&& &#43;- org.springframework:spring-tx:jar:2.5.2:test&
[INFO]&&& \- org.unitils:unitils-database:jar:3.3:test&
[INFO]&&&&&& &#43;- org.unitils:unitils-dbmaintainer:jar:3.3:test&
[INFO]&&&&&& |& &#43;- org.hibernate:hibernate:jar:3.2.5.ga:test&
[INFO]&&&&&& |& |& &#43;- net.sf.ehcache:ehcache:jar:1.2.3:test&
[INFO]&&&&&& |& |& &#43;- asm:asm-attrs:jar:1.5.3:test&
[INFO]&&&&&& |& |& &#43;- dom4j:dom4j:jar:1.6.1:test&
[INFO]&&&&&& |& |& &#43;- antlr:antlr:jar:2.7.6:test&
[INFO]&&&&&& |& |& &#43;- cglib:cglib:jar:2.1_3:test&
[INFO]&&&&&& |& |& \- asm:asm:jar:1.5.3:test&
[INFO]&&&&&& |& \- org.dbunit:dbunit:jar:2.2.2:test&
[INFO]&&&&&& |&&&& &#43;- junit-addons:junit-addons:jar:1.4:test&
[INFO]&&&&&& |&&&& |& &#43;- xerces:xercesImpl:jar:2.6.2:test&
[INFO]&&&&&& |&&&& |& \- xerces:xmlParserAPIs:jar:2.6.2:test&
[INFO]&&&&&& |&&&& &#43;- poi:poi:jar:2.5.1-final-:test&
[INFO]&&&&&& |&&&& \- org.slf4j:slf4j-nop:jar:1.4.3:test&
[INFO]&&&&&& &#43;- commons-dbcp:commons-dbcp:jar:1.2.2:test&
[INFO]&&&&&& |& \- commons-pool:commons-pool:jar:1.3:test&
[INFO]&&&&&& \- org.springframework:spring-jdbc:jar:2.5.2:test&
[INFO] ------------------------------------------------------------------------&
[INFO] BUILD SUCCESS&
[INFO] ------------------------------------------------------------------------&
[INFO] Total time: 8.250s&
[INFO] Finished at: Fri Jun 08 09:08:09 CST 2012&
[INFO] Final Memory: 7M/245M&
[INFO] ------------------------------------------------------------------------&
我原来一个使用idea分析不出的隐式依赖就是通用mvn dependency:tree找到的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3304358次
积分:33731
积分:33731
排名:第96名
原创:191篇
转载:1828篇
评论:367条
(37)(40)(43)(73)(15)(10)(17)(12)(6)(20)(27)(54)(71)(97)(74)(32)(2)(24)(21)(62)(60)(36)(23)(27)(46)(34)(76)(63)(121)(142)(74)(54)(120)(77)(42)(4)(12)(19)(1)(9)(15)(19)(18)(16)(31)(79)(68)一次完整的jar包矛盾解决过程 - 软件架构设计当前位置:& &&&一次完整的jar包矛盾解决过程一次完整的jar包矛盾解决过程&&网友分享于:&&浏览:12次一次完整的jar包冲突解决过程
作为Java程序员,会经常碰到jar包冲突,特别是涉及到的外部依赖越多,冲突概率就会越大。由于我们的应用代码都是使用maven来管理的,所以依赖的解决相对比较容易。不过最近碰到的一个问题,确实经历了好多步才最终定位。
现象:应用启动过程中,spring容器启动失败,错误日志很明确,找不到CollectionUtils.isEmpty()方法,jar冲突的典型症状之一。
首先,确认了这个类是apache的commons-collections中的工具类(在eclipse中ctrl+shift+T或者command+shitf+T寻找CollectionUtils是来自哪个jar中,同时也可以看看是不是含有这个方法),那么执行maven命令分析依赖树mvn dependency:tree -e -Dincludes=*:commons-collections*,看看应用中如何依赖commons-collections,依赖路径以及依赖版本。结果稍微出乎意料,有两个commons-collections依赖,只是groupId不同(这个时候maven是无能为力的,maven会认为这两个依赖是不同的,不会认为是一样的,因为maven对依赖的标识就是坐标,与jar中的内容无关),一个是apache-collections,另外一个是commons-collections,查看第二个中的CollectionUtils是有isEmpty方法的,第一个是没有的,而且第一个jar和第二个jar的包结构是完全相同的,apache-collections是外部系统的类库引入的,感觉好奇葩,于是果断排除之。重新查看依赖树,OK,打包重启,依然相同的错误。
接下来,打开war包,看下WEB-INF/lib下的commons-collections确实是3.2.1,没有问题。说明war包没有问题,最起码war内不会冲突,war包没问题。那就是jboss有问题,由于之前碰到过类似的问题,直接去${jboss_home}/server/default/lib下查看,升级其中的commons-collections到3.2.1即可(应用的jar和容器中的冲突的话,以容器为主,因为容器被优先加载),无需打包,重启jboss。自信满满地以为问题解决了,结果错误还是没变。
继续,查看jboss其他的目录,看不到commons-collections的影子。貌似到此,无路可走了。所以想想,服务器上肯定还有commons-collections-3.1存在,或许是在隐藏目录中(为毛当时没想起来用find名称搜索commons-collections)。没办法,只能通过打日志来看看CollectionUtils是从哪儿加载的了,使用了几行代码:
URL url = getClass().getClassLoader().getResource("org/apache/commons/collections/CollectionUtils.class");
LOG.error("CollectionUtils is loading from {}", url.getPath());
重新打包部署之后,查看日志信息,显示CollectionUtils是用WEB-INF/lib/commons-collections-3.2.1.jar中加载的,真的好意外,一直都在说,jboss中的jar优先加载啊,然后才会加载war的?那为神马会显示是用war中加载的呢?而且war中的是jar包版本是OK的,至此,基本无路可走了。除非?除非那个获取加载路径的代码是有问题的,因为和我的认知确实是冲突的。于是就getResource()方法去问了web容器方面的“神”,给出的解释是这个方法返回的路径不一定是真实的加载路径,和具体的容器实现有关。
最后,貌似打开了思路,但是什么办法可以知道类的真实记载路径呢?jvm启动参数跟踪,-XX:+TraceClassLoading加在jboss其中参数中,重启jboss,查看应用启动之后的jboss日志。好吧,日志文件很大,搜索下CollectionsUtils,确实是从一个隐藏目录加载的commons-collections,问题定位到了,解决办法不用说了。
如果前边真的用find命令搜索解决了问题,那么也不会有后边对认知的颠覆,那样还会一直认为那个api是救命稻草呢,不知道要持续到什么时候呢。另外,用find命令也只能去试探性地搜索commons-collections这个文件,但是不能排除有的类库会把commons-collections的代码内嵌在自己的jar中,这种事儿见到不少。所以走了最长的路,收获一定是最多的:)。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有对于Jar包冲突问题,我们开发人员经常都会有碰到,当我们使用一些jar包中的类、方法等,或者有时遇到一些日志系统的问题(参考另一篇文章),我们会遇到ClassNotFoundException,NoSuchFieldException,NoSuchMethodException
之类的运行时异常,从经验上我们就会判断,Jar包冲突了。解决Jar包冲突问题,每个人都有每个人的方法,这里我介绍一下我的方法,供大家参考。
当遇到jar包冲突时,我们首先确定是哪个jar包冲突了,这个很容易,看我们调用的类或方法,是属于哪个Jar包。然后就是要找出冲突了,我这里使用命令
mvn dependency:tree -Dverbose -Dincludes=&groupId&:&artifactId&
填写上Jar包的groupId和artifactId,可以只有一个,但是中间的冒号不要少,这样就会输出依赖树,而且是仅包含这个Jar包的依赖树,这样那些地方依赖了这个Jar包的那个版本就一目了然了。
例如,我的项目中notify-common包存在冲突,我们使用命令
mvn dependency:tree -Dverbose -Dincludes=:notify-common
得到依赖树输出
[INFO] com.taobao.wlb:bis-server:war:1.0-SNAPSHOT
[INFO] &#43;- com.taobao.wlb:bis-core:jar:1.0-SNAPSHOT:compile
\- com.taobao.logistics:schedule-client:jar:1.1.1:compile
\- (com.taobao.notify:notify-common:jar:1.8.15:compile - omitted for conflict with 1.8.19.26)
[INFO] \- com.taobao.notify:notify-tr-client:jar:1.8.19.26:compile
&#43;- com.taobao.notify:notify-common:jar:1.8.19.26:compile
\- com.taobao.notify:notify-remoting:jar:1.8.19.26:compile
\- (com.taobao.notify:notify-common:jar:1.8.19.26:compile - omitted for duplicate)
看一下依赖树中所有的叶子节点就是所有的notify-common包,我们可以看到我们依赖的bis-core中依赖了schedule-client包,它依赖了一个notify-common包,版本是1.8.15,第四行的后面也提示了这个包同其他包有冲突
- omitted for conflict with 1.8.19.26)。而我们的系统依赖的notify-tr-client包所依赖的版本是1.8.19.26,于是我们知道是这里冲突了,在POM排除掉依赖,OK了。
这里我们对我们执行的命令做一个简单的说明。
mvn dependency:tree -Dverbose -Dincludes=&groupId&:&artifactId&
第一部分mvn dependency:tree是maven依赖的分析命令,作用是对我们的项目的依赖进行分析,并输出项目依赖树
第二部分-Dverbose的作用是添加了verbose一个环境变量,起的作用是在分析项目依赖时输出明细,这样项目中依赖的所有引用都会被输出出来,包含了所有的间接引用,会有很多很多,我们只需要我们要找的,所以就需要第三个参数了
第三部分-Dincludes=&groupId&:&artifactId&的作用就是进行过滤,只包含我们想要的依赖的依赖时,排除掉其它不需要的,依赖树的所有叶子节点就是我们的找的依赖包。其中的groupId和artifactId可以只填写一个,为了保证准确性,一般都会填两个(填写时不包括尖括号)。
其他方法:
1、对于maven工程,我的办法是使用eclipse来解决,点开pom.xml,切换到hierarchy dependency,右上角搜索对应的包,可以清晰地看到冲突版本
2、可以使用idea,在pom.xml中右单击
选择Diagrams-》show dependencies
dependency:tree -Dverbose & tree.log&
直接输出冲突的jar文件
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
主要记录自己在阅读文学书籍时的感慨以及遇到的好的&#26684;言、语句。
访问:413次
排名:千里之外

我要回帖

更多关于 maven jar包冲突 的文章

 

随机推荐