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
版权声明:本文为博主原创文章,转载请附上博客链接!
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除