Maven解决jar包冲突示例

 项目背景:在使用grpc远程连接框架时,导入jar包至已有的项目,在客户端与服务器连接时,一直报错:NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;J)V

产生原因:由于项目中已经有guava包,且版本是18.0.0.而grpc同样依赖这个包,但是grpc依赖的guava版本需要20.0.0版本以上,所以报错。

排查问题过程: 1,百度错误,查询到一堆的杂七杂八的回答。

                          2,检查grpc引入的jar包是否有问题,替换成官方文档给出的示例。另写了一个独立的demo,尝试连接客户端和服务端,连接成功。说明jar包没有引入错误。检查demo和已有工程的区别。

                          3,结合百度答案,缩减答案范围,怀疑是jar包冲突。利用idea工具,查看jar包的依赖关系。发现原先项目中guava已经存在且版本为18.0.0. 为是因确认版本造成报错,将demo中的guava版本换成18.0.0(在pom文件中显示添加guava的jar包),发现连接失败,且错误信息一致。确认是由jar包版本过低导致连接失败。

                          4,思考如何替换guava版本,恶补maven知识。

                           利用maven最短路径优先原则以及最先声明原则:直接在使用到grpc的工程下,在pom文件的最开始位置引入20.0.0版本的jar包

                          最大路径优先原则:

                               D1和D2是相同jar包的不同版本

                               Maven 面对 D1 和 D2 时,会默认选择最短路径的那个 jar 包,即 D2。E->F->D2 比 A->B->C->D1 路径短 1。

                          最先声明优先:

                               如果路径一样的话,如: A->B->D1, E->F->D2 ,两个依赖路径长度都是 2,那么就选择最先声明。

                         体现在pom文件中是:从上到下,上为先

                           jar包冲突解决参考:https://blog.csdn.net/noaman_wgs/article/details/81137893

      

你可能感兴趣的:(Maven解决jar包冲突示例)