问题描述
今调试一个程序,引入了两个不同版本的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.
解决方案二:
是不是你库上没有这个包或者groupid, artifactid版本指定错误?
解决方案三:
不会出现你说的这种情况,如果引入两个版本,那么两个版本都会包含在项目的lib中.
解决方案四:
在有冲突的依赖下面加上exclusion,如不想用slf4j-log4j12默认的slf4j-api版本,而自己指定一个,可以这样:[xhtml] view plaincopy<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j-log4j12.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> 有时候不一定能发现是哪几个依赖冲突了,这时可以上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.hibernatehibernate-core3.3.1.GAorg.hibernatehibernate-entitymanager3.3.2.GA 等,再在那些dependency里加入exclusion去掉javassist就可以了,如下:[xhtml] view plaincopy<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> <exclusions> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>