在IDEA⾥解决maven的pom引⽤jar包冲突
前⾔
有的时候,我们要给系统添加⼀个新功能,可能需要引⼊新的pom依赖,⼀切都搞定好后,运⾏程序却发现报NoClassDeFoundError错误,或者其它莫名奇妙的问题。
这个时候很有可能就是新引⼊的pom依赖⾥某个jar包和之前系统已有的冲突了。
那么,该从何下⼿呢?
解决⽅案
1.mvn dependency:tree
mvn dependency:tree 可以完整清晰的展⽰出所有的jar包(包括传递性依赖),并且是以层级树⽅式展现,⾮常直观。
这边⼜有两种使⽤⽅式
1.1 mvn dependency:tree>
⽤mvn dependency:tree>,直接输出到当前项⽬下,然后在idea中打开,搜索要的jar包名字即可.
这⾥的 “+-” 和”\-“并没有什么意义,只是为了让分级看起来更直观。
如图,可看到jline是在zookeeper中被间接引⽤的
1.2 ⽤include参数
H:\下载\新建⽂件夹\yjg>mvn dependency:tree -Dincludes=jline
[INFO] Scanning for projects…
[WARNING]
[WARNING] Some problems were encountered while building the effe
[WARNING] ‘build.plugins.plugin.version’ for org.apache.maven.pl
[WARNING]
[WARNING] It is highly recommended to fix these problems because
[WARNING]
[WARNING] For this reason, future Maven versions might no longer
[WARNING]
[INFO]
[INFO] ———————————————————
[INFO] Building esshop Maven Webapp 0.0.1-SNAPSHOT
[INFO] ———————————————————
[INFO]
[INFO] — maven-dependency-plugin:2.8:tree (default-cli) @ essh
[INFO] esshop:esshop:war:0.0.1-SNAPSHOT
[INFO] – keeper:zookeeper:jar:3.3.3:compile
[INFO] – jline:jline:jar:0.9.94:compile
[INFO] ———————————————————
[INFO] BUILD SUCCESS
[INFO] ———————————————————
[INFO] Total time: 3.256 s
[INFO] Finished at: 2017-12-05T08:57:49+08:00
如果想看冲突和重复的具体情况,⽤verbose参数
如图,⽤了程序显式定义的版本
H:\下载\新建⽂件夹\yjg>mvn dependency:tree -Dverbose -Dincludes=commons-collections
[INFO] Scanning for projects…
[WARNING]
[WARNING] Some problems were encountered while building the effective model for esshop:esshop:war:0.0.1-SNAPSHOT [WARNING] ‘build.plugins.plugin.version’ for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 621, [WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ————————————————————————
[INFO] Building esshop Maven Webapp 0.0.1-SNAPSHOT
[INFO] ————————————————————————
[INFO]
[INFO] — maven-dependency-plugin:2.8:tree (default-cli) @ esshop —
[INFO] esshop:esshop:war:0.0.1-SNAPSHOT
[INFO] +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] +- org.hibernate:hibernate:jar:3.2.2.ga:compile
[INFO] | – (commons-collections:commons-collections:jar:2.1.1:compile – omitted for conflict with 3.2.1)
[INFO] +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] | – org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[INFO] | – (commons-collections:commons-collections:jar:3.1:compile – omitted for conflict with 3.2.1)
[INFO] +- org.springframework.security:spring-security-core:jar:2.0.4:compile
[INFO] | – (commons-collections:commons-collections:jar:3.2:compile – omitted for conflict with 3.2.1)
[INFO] +- org.apache.velocity:velocity:jar:1.5:compile
[INFO] | – (commons-collections:commons-collections:jar:3.1:compile – omitted for conflict with 3.2.1)
springframework jar包下载
[INFO] – net.sf.json-lib:json-lib:jar:jdk15:2.4:compile
[INFO] – (commons-collections:commons-collections:jar:3.2.1:compile – omitted for duplicate)
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
2. 查看Maven的依赖关系图
1. 打开项⽬的Maven界⾯,⼀般在右侧⼯具栏
2. 按下Ctrl + shift + Alt + U组合键,或者点击上⾯菜单栏的倒数第三个按钮
需要说明的是不同的idea版本,具体的⼯具栏可能略有不同,但是差别不会太⼤,我截图的这个是2019版本,之前的2016版本我也⽤过,有些微差别。
这张图有以下⼏点
1. 可以放⼤缩⼩
2. 双击可以导航到指定的pom⽂件
3. 冲突的jar包关系线会⽤红⾊的线标记
4. 通过这个线可以到你在pom⾥⾯定义的最上层依赖
3. 通过Project Structure或者Maven Dependencies来定位
上⾯的依赖关系图虽然很直观,但是有⼀个缺点就是不能搜索关键字定位,⼀个简单的⽰例demo就这么多依赖jar包了,正常⽣产使⽤的系统那这张图要想看清楚定位到冲突的jar包(虽然有红线标记,但是复杂的系统,冲突的jar包也多),⾮常不⽅便。
所以我个⼈更喜欢通过 Project Structure或者Maven Dependencies来定位有冲突的jar包。
正常情况下,通过错误提⽰,我们能知道⼤概是什么jar包冲突了,这边⽐⽅说Maven: le.guava:guava 这个冲突了(这个可是⾮常容易冲突的)。
依次点开 File-> Project Structure ->Modules->选中Source->Denpendencies
这个有个好处,就是直接 Denpendencies 界⾯输⼊关键字,就能定位想要的jar包,如果有多个结果,使⽤键盘上的上下键就能移动光标。
到它,然后右击,点击remove。重启,冲突就解决了。
不过,这种⽅法,只是当前有效,如果maven重新编译过后,还是会恢复成原来的。原理也简单,那就是它并没有从pom⽂件⾥exclude该
jar包。
最简单的办法其实就是在Maven- Denpendencies⾥搜索(同上)关键字定位jar包
就能知道它的层级关系,然后去pom⽂件⾥
1<exclusions>
2<exclusion>
3<groupId&le.guava</groupId>
4<artifactId>guava</artifactId>
5</exclusion>
6</exclusions>
总结
不管是何种⽅法,最后体现出来的代码就是要在pom⽂件⾥把冲突的jar包exclusion掉。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。