maven 依赖冲突问题

今调试一个程序,引入了两个不同版本的jar包,发生了冲突,但是看到的现象是一个jar包都没引入进来。什么情况下发生冲突会一个jar包都引入不进来呢?

maven引入依赖的时候,有的时候会发生循环依赖的情况,造成依赖失败,例如A依赖于B,B又依赖于C,C又依赖于A,造成一种环路,这样的话会失败。像楼上的那种排除依赖,正常情况下是可以正常依赖成功的。
假设依赖A依赖于B,D也依赖于B,B在pom中有2个版本B1,B2(有可能是直接依赖,也有可能是间接依赖),那么maven会通过以下机制引入依赖:

如果A直接依赖于B1,A-B1,D间接依赖于B2,例如D-C-B2,那么maven会有优先选择依赖路径短的那个版本,即依赖B1,而不依赖B2。假设B1,B2都是间接依赖,例如A-C-B1,D-C-B2,那么在选择B的依赖版本的时候,谁在pom文件中优先声明依赖了,那么就依赖哪个,假设A-C-B1在pom文件中优先D-C-B2声明了,那么将引入B1.

在有冲突的依赖下面加上exclusion,如不想用slf4j-log4j12默认
的slf4j-api版本,而自己指定一个,可以这样:
[xhtml] view plaincopy


org.slf4j

slf4j-log4j12

${slf4j-log4j12.version}





org.slf4j

slf4j-api





有时候不一定能发现是哪几个依赖冲突了,这时可以上
http://mavenrepository.com查一下,比如发现lib里有
javassist-3.4.GA.jar和javassist-3.7.ga.jar,而自己
想用的是javassist-3.7.ga.jar,可以在上面的网站里
查javassist-3.4.GA,在This artifact is used by ... 里会列出依赖于它的一些dependency,

org.hibernate hibernate-core 3.3.1.GA
org.hibernate hibernate-entitymanager 3.3.2.GA 等,再在那些dependency里加入exclusion去掉javassist就可以了,如下:
[xhtml] view plaincopy


org.hibernate

hibernate-entitymanager

${hibernate.version}





javassist

javassist





不会出现你说的这种情况,如果引入两个版本,那么两个版本都会包含在项目的lib中.

是不是你库上没有这个包或者groupid, artifactid版本指定错误?