jar包冲突现象
某天在maven项目中,启动的时候,突然报了这个错误:
java.lang.nosuchmethoderror: org.springframework.beans.factory.annotation.injectionmetadata.needsrefresh
查找原因
在出现这个错误以前,我只是在项目中多加了一个dependence,我猜想应该就是新加的这个依赖导致问题的出现,
- 通过我查找 stackoverflow 以及分析源码分析得到,这个方法只存在于spring 4.X中,但是spring 3.X是没有这个方法的。
- 项目中本来引用的都是spring 4.X 的 依赖,一开始也是存在这些方法的,后来发现是在新引入的依赖中,又依赖了spring 3.x 的依赖,直接形成了传递依赖。
- 然后项目居然会直接的采用旧的版本,而采用新的版本,原因在就在于maven 的最短路径路径优先原则,根据maven 的依赖图来看,spring 3.x的版本是要更近一些的,所以项目启动时会使用它,而舍弃了原来的较远一些的4.x
解决办法
- 这里建议,如果公司内部jar包依赖不是很规范,到处都是传递依赖的情况下,应该直接禁用传递依赖,如下图
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>0.94.17</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>