老夫也是刚不如程序员的世界,所以对于一些程序员常用的东西也都只是一知半解,比如说maven。老夫就只知道maven具体是个啥,然后浑然不知会存在maven依赖冲突的问题。那么老夫现在遇到了依赖冲突,自然要好好看看这个依赖冲突了的问题以及解决了。

什么是依赖冲突

Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子,现在你的项目中,使用了两个Jar包,分别是A和B。现在A需要依赖另一个Jar包C,B也需要依赖C。但是A依赖的C的版本是1.0,B依赖的C的版本是2.0。这时候,Maven会将这1.0的C和2.0的C都下载到你的项目中,这样你的项目中就存在了不同版本的C,这时Maven会依据依赖路径最短优先原则,来决定使用哪个版本的Jar包,而另一个无用的Jar包则未被使用,这就是所谓的依赖冲突。
maven-depences
在大多数时候,依赖冲突可能并不会对系统造成什么异常,因为Maven始终选择了一个Jar包来使用。但是,不排除在某些特定条件下,会出现类似找不到类的异常,所以,只要存在依赖冲突,在我看来,最好还是解决掉,不要给系统留下隐患。

解决冲突的方法

解决冲突,一般都是使用Maven提供的标签,标签需要放到标签内部,就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>scala-parser-combinators_2.11</artifactId>
<groupId>org.scala-lang.modules</groupId>
</exclusion>
<exclusion>
<artifactId>scala-library</artifactId>
<groupId>org.scala-lang</groupId>
</exclusion>
</exclusions>
</dependency>

老夫这里的flink-table-planner_2.11 依赖于slf4j-api包,但是其他的模块也会依赖这个包,而这个包的版本不同,所以我们用maven的标签排除掉slf4j-api,这样,我们的maven就不会下载flink-table-planner_2.11所依赖的slf4j-api 的JAR包了。

Maven Help的使用

但是,给老夫一个pom.xml,老夫也不知道这个依赖冲突会在哪。所以这里有两种方式获取,先讲简单的方式,那就是我们的插件:maven help.
maven-help
我们打开 pom.xml , 在下方,可以看到这个“Dependency Analyzer”,前提是你要安装了 Maven Help插件,我们可以在 ② 中看到有三个选项,其中我们可以看第一个,第一个就可以给我我们显示出所有的冲突的依赖,老夫在这里是在第二个选项,是按照列表的形式显示出所有的依赖,其中,有依赖冲突的,显示为红色,我们选择一个含有依赖冲突的JAR包,可以看到右侧,我们可以看到他的版本信息,很明显当前老夫选择的这个包的依赖冲突是 1.1.3 版本冲突了。我们选择冲突的依赖包,右键,可以看到有两个选项,我们选择 “Exclude” , 这样就可以帮我们解决依赖冲突了,当我们全部解决后,在重新 “import maven” 就可以看到我们扥依赖冲突解决了。此时在看 Conflicts ,可以看到这个很干净,就说明我们的依赖冲突解决了。

Maven Dependency

第二种方式,就是 IDEA的依赖关系图,按图示打开,我么可以看到这个图,如果存在依赖冲突,那线条就是红色的,否则就是蓝色的,那这里,老夫刚刚改过了,自然都是蓝色的。
dependency-diagam