Maven 包冲突解决过程
记录一次 maven 包冲突解决过程,项目地址链接。
查看错误方法
首先要将项目克隆到本地,然后运行,找到出错的位置,以及出错的信息。
如图所示,错误的位置在 MainTest.java 文件第六行,错误信息 NoSuchMethod
,表示没有找到这个方法。根据位置提示,一层一层往下找,发现原来是 A.java 这个类中调用的 getJsonpFunction
方法找不到
查看包冲突
通过使用 maven helper 插件查看包的依赖树。如图所示,spring-web:5.1.8.RELEASE 版本和 spring-web:4.3.6.RELEASE 版本冲突了。图上的 4.3.6 版本为红色,可知,maven 使用的是 5.1.8 版本。我们根据 maven 解决包冲突的就近原则来看,5.1.8 离项目的距离为1,4.3.6 的距离为2,因此保留5.1.8版本,再次证实了这一点。
追根溯源
既然知道了是 spring-web 这个包的问题。我们就访问 maven 仓库,找到对应的版本,访问他的 github 主页。
找到了 github 仓库,进入报错的那个类,通过切换 tags 来切换不同版本对应的源代码,两者进行比较。
对比发现在5.1.8版本 org.springframework.http.converter.json.MappingJacksonValue 中不存在 getJsonpFunction
这个方法。而 4.3.6 中却有。因此可以断定,我们项目本该使用 4.3.6 版本,而 maven 帮我们剔除了 4.3.6 版本,保留了 5.1.8 版本,导致找不到 getJsonFunction
而报错。
解决冲突
知道了冲突的原因,我们就只需要把 5.1.8 版本的依赖注释掉就行,这样 maven 就会帮我们加载 4.3.6 版本的包了。
同时也可以将 5.1.8 版本的依赖改成 4.3.6 版本,解决冲突。