解决Maven依赖冲突

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

 
  

	log4j
	log4j
	1.2.17
	
		
			jmxri
			com.sun.jmx
		
		
			jmxtools
			com.sun.jdmk
		
	

这段配置说明:引入log4j,log4j本身又依赖了jmxri、jmxtools,这两个并不需要

2、使用true
Project A的pom文件有如下配置:
 
  

	log4j
	log4j
	1.2.17
	true
 
  
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:                        ojdbc14

温馨提示:用完删掉lib.zip和lib目录

d、原来是pay-module这个依赖引入了ojdbc14,所以在Project A的pom.xml中,pay-module依赖下配置exclusions,剔除ojdbc14


	com.pay.module
	pay-module
	1.2.17
	
		
			ojdbc14
			com.oracle
		
	


你可能感兴趣的:(解决Maven依赖冲突)