因为Maven使用依赖传递的方式,当你引入一个依赖的时候,如果该依赖(dependency)本身也引用了其他依赖,我们的应用就自动引用了依赖的依赖,这样不可避免的会造成依赖冲突!
在将应用打包之前,我们应该先检查我们的依赖列表,检查步骤如下:
1、执行maven命令:mvn dependency:tree,显示我们的maven树,这里会打印所有的依赖,包含依赖的依赖
2、确认所有的依赖是否都是我需要的?
3、检查同一个依赖是否存在多个版本?如果有多个版本,说明是冲突了的。补充另一种情况也算冲突:比如oracle的jdbc包,ojdbc6-11.2.0.3.jar和ojdbc14-10.2.0.3.0.jar,它们的artifactId虽然不同,但都是oracle的jdbc包。
如果某个依赖并不是我们想要的,且它是由引入的依赖引入的(即:依赖的依赖),可以采取以下方式剔除:
1、使用exclusions
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<exclusions>
<exclusion>
<artifactId>jmxri</artifactId>
<groupId>com.sun.jmx</groupId>
</exclusion>
<exclusion>
<artifactId>jmxtools</artifactId>
<groupId>com.sun.jdmk</groupId>
</exclusion>
</exclusions>
</dependency>
这段配置说明:引入log4j,log4j本身又依赖了jmxri、jmxtools,这两个并不需要
2、使用<optional>true</optional>
Project A的pom文件有如下配置:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<optional>true</optional>
</dependency>
Project B依赖了Project A
这段配置说明:Project A依赖了log4j,Project B不会自动引入log4j。凡是在Project A中依赖的属性:optional为true的,Project B都不会自动引入这些依赖,除非在Project B中明确引入。
exclusions和optional的说明参照:
https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
3、最近发现一个特别无语的现象,执行maven命令:mvn dependency:tree,打印的依赖树是没有某个依赖的,但是打出来的war包,WEB-INF/lib下面就是有这个依赖,只得将lib下的jar包全部解压,找出所有的pom文件,最终发现在某个jar包的pom文件引入了这个依赖,对这个jar依赖配置exclusions,剔除我不要的那个依赖,问题得以解决
附上步骤:
Project A的pom.xml,明确引入了ojdbc6.11.2.0.3.jar,但是WEB-INF/lib莫名多了个ojdbc14-10.2.0.3.0.jar,依赖树是没有打印这个的
a、war包抽出WEB-INF/lib,将lib打成压缩成zip包:lib.zip
b、将lib.zip传到一台linux机器上的目录:/tmp
c、解压:
cd /tmp
unzip lib.zip
cd lib
find ./ -type f -name "*jar" -exec jar -xvf {} \;
find ./ -type f -name "*jar" -exec rm -rf {} \;
find ./ -type f -name "pom.xml"|xargs grep "ojdbc14"
最后一个命令打印:
./META-INF/maven/com.pay.module/pay-module/pom.xml: <artifactId>ojdbc14</artifactId>
温馨提示:用完删掉lib.zip和lib目录
d、原来是pay-module这个依赖引入了ojdbc14,所以在Project A的pom.xml中,pay-module依赖下配置exclusions,剔除ojdbc14
<dependency>
<groupId>com.pay.module</groupId>
<artifactId>pay-module</artifactId>
<version>1.2.17</version>
<exclusions>
<exclusion>
<artifactId>ojdbc14</artifactId>
<groupId>com.oracle</groupId>
</exclusion>
</exclusions>
</dependency>