Maven中jar包矛盾原理与解决方式转载

原创
小哥 2年前 (2022-12-30) 阅读数 64 #大杂烩

Maven中jar包冲突是开发过程中常见且棘手的问题。我们需要知道 jar可以更好地解决包冲突的原则。jar包冲突。本文将来自jar从两个方面阐述了包冲突的原理和解决方法。Maven中jar解决程序包冲突。

一、Maven中jar包冲突原因
MAVEN如果项目正在运行,将报告以下错误:

Caused by:java.lang.NoSuchMethodError
Caused by: java.lang.ClassNotFoundException

十有八九,是的。Maven jar由包冲突引起。所以jar包冲突是如何产生的?

首先我们需要了解jar包依赖项的传递性。

1,依赖关系转移
当我们需要时A当你依靠它时,你就会pom.xml中引入A的jar包裹虽然引入了A的jar包装可能取决于B的jar包,这样Maven在解析pom.xml反过来A、B 的jar包裹都带来了。

例如:
在Spring Boot在应用程序中导入Hystrix和原生Guava的jar包:

com.google.guava guava 20.0 org.springframework.cloud spring-cloud-starter-netflix-hystrix 1.4.4.RELEASE 利用Maven Helper插件将导入项目jar包依赖关系树: 从图中可以看出Hystrix包含对Guava jar对包依赖项的引用: Hystrix -> Guava,所以在介绍中Hystrix当依赖时,它将是。Guava还引入了依赖性。 2、jar数据包冲突原则 那么jar包如何冲突? 假设以下依赖关系: A->B->C->D1(log 15.0):A中包含对B的依赖,B中包含对C的依赖,C中包含对D1对于依赖关系,假设是D1是日志jar包,version为15.0 E->F->D2(log 16.0):E中包含对F的依赖,F包含对D2对于依赖关系,假设是D2是相同的日志jar包,version为16.0 当pom.xml文件中介绍A、E根据Maven传递依赖原理,D1、D2将介绍,以及D1、D2相同的依赖关系。D不同版本。 当我们打电话时D2中的method1()方法,而D1中是15.0版本(method1可能是D升级后添加方法),可能没有此方法,因此JVM在加载A中D1依赖时,找不到method1方法,将报告NoSuchMethodError此时生成错误。jar包冲突。 注: 如果你打电话method2()方法D1、D2两者都包含此方法(和升级版本D2此方法未更改,因此即使D有多个版本,不会有版本冲突。) 例如: 利用Maven Helper插件分析结果:Guava此依赖项包会产生冲突。 我们以前导入过Guava的原生jar包,版本号为20.0; 现在提示Guava发生冲突,冲突的位置为Hystrix所在的jar打包,这样你就可以猜了Hystrix包含引用Guava不同的版本jar对包的引用。 要验证我们的推测,请使用Maven Helper插件打印输出Hystrix依赖的jar tree: 您可以看到:Hystrix jar依赖于Guava jar包是15.0的版本,我们在pom.xml在中介绍的本地人Guava jar包是20.0版本,那样。Guava就有15.0 与20.0因此,出现了这两种版本jar包冲突。 二、 Maven中jar包冲突的解决方案 Maven 解析 pom.xml 文件,相同 jar 只保留一个程序包,因此面临多个版本的jar袋子,需要怎么解决? 1、 Maven默认处理策略 最短路径优先 Maven 面对 D1 和 D2 默认情况下,选择路径最短的路径。 jar 包,即 D2。E->F->D2 比 A->B->C->D1 路径短 1。 第一个语句优先级 如果路径相同,例如: A->B->C1, E->F->C2 两个依赖路径长度均为 2,然后选择先声明。 2,移除依赖项:用于排除依赖项的依赖项。jar包 (1)我们可以使用Maven Helper插件中的Dependency Analyzer冲突分析jar包,然后在相应的红色标记版本中jar在包上方单击execlude,你可以jar打包。 刷新后,冲突将消失。 (22) 手动排除 或手动输入pom.xml中使用排除冲突的标签jar包(上面使用插件Maven Helper中的execlude方法实际上等同于该方法): org.springframework.cloud spring-cloud-starter-netflix-hystrix 1.4.4.RELEASE com.google.guava guava mvn分析包冲突命令: mvn dependency:tree 1 3 版本锁定原则:通常用于继承项目的父项目 正常项目是多模块项目,例如moduleA和moduleB共同依赖X这种依赖性可以是X提取它并同时设置其版本号,以便X当您依赖升级时,不需要单独配对。moduleA和moduleB模块中的依赖项X升级以避免太多地方(moduleC、moduleD….)引用X依赖时忘记升级jar包冲突,这也是实际项目开发中常见的方法。 首先定义父级pom.xml,将公共依赖项放入pom.xml声明如下: spring4.2.4 org.springframework spring-beans ${spring.versio} 这样如moduleA和moduleB在引用Spring-beans jar包,直接使用父级pom.xml中定义的公共依赖关系可以是: moduleA在其pom.xml使用spring-bean的jar包(没有更多版本定义): org.springframework spring-beans moduleB在其pom.xml使用spring-bean的jar包装与上述类似: org.springframework spring-beans 以上是要解决的日常发展Maven当然,在实际发展中有几个小的冲突计划jar一揽子冲突的问题可能比这复杂得多,需要处理具体问题。 2018/07/20 15:14:00 in SH. 参考:https://blog.csdn.net/u011955252/article/details/78927427 --------------------- 作者:是Guava不是瓜娃 来源:CSDN 原文:https://blog.csdn.net/noaman\_wgs/article/details/81137893 版权声明:本文为博主原创文章,转载请附上博客链接!
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门