在我们引入第三方的SDK进行开发时,经常会遇到jar包冲突的情况,此时我们通过排查找到冲突的jar包,将其排除掉即可。
在项目中我们一般会使用maven来管理依赖,我们可以借助一些工具来查看当前项目的依赖情况:
- mvn dependency:tree:该命令会打印出当前项目的使用的依赖的关联关系
- maven helper:IDEA插件,可以方便的查看项目的依赖
命令的方式
在控制台输入命令:mvn dependency:tree
,此时会以树的形式打印项目的相关依赖:
INFO] +- org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile
[INFO] +- org.apache.tomcat:tomcat-jsp-api:jar:7.0.70:compile
[INFO] | +- org.apache.tomcat:tomcat-el-api:jar:7.0.70:compile
[INFO] | \- (org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile - omitted for duplicate)
[INFO] +- net.sf.jasperreports:jasperreports:jar:5.6.0:compile
[INFO] | +- (commons-beanutils:commons-beanutils:jar:1.8.0:compile - omitted for conflict with 1.8.3)
[INFO] | +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] | +- commons-digester:commons-digester:jar:2.1:compile
[INFO] | | +- (commons-beanutils:commons-beanutils:jar:1.8.3:compile - omitted for duplicate)
[INFO] | | \- (commons-logging:commons-logging:jar:1.1.1:compile - omitted for duplicate)
每个依赖项后面会包含此依赖目前的引用状态:
- compile:编译成功的
- omitted for duplicate:有JAR包被重复依赖了,但是JAR包的版本是一样的
- omitted for conflict with xx:和别的JAR包版本冲突了,该行的JAR包不会被引入
插件的方式
在IDEA的应用商店搜索Maven Helper,安装后打开要分析的pom文件,点击Dependency Analyzer
:
此时可以根据选项选择查看所有依赖关系和冲突的依赖关系。
通过在包上右键“Jump to Source”或者快捷键F4,直接跳转到依赖的坐标。
排除或者删除相关依赖
通常情况下我们可以使用<exclusions>
标签来排除掉某个包中依赖的其他jar包:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.3.2</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
但是也有特殊情况,如果我们使用的第三方的依赖没有maven坐标信息,我们可以通过解包的方式删除相关依赖,在重新压缩为jar,以达到排除依赖的目的。
找到相应的类所在的jar包,copy到一个全新的目录,打开命令行,切换到相应目录,输入:
jar xvf xxx.jar
解压,根据报错类,找到相应的类名,直接删除,然后再打开命令行,输入:
jar cvfM xxx.jar aaa
其中 xxx.jar 为新生产jar包名字,aaa 为需要打包成jar包的文件夹名,就是开始解压后的文件夹名。
现在就得到了一个已经删除了冲突类的全新jar包。
此时将这个jar包重新引入到项目中即可。
回复