因为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>