maven依赖版本没有按照最短路径原则生效的解决方案
女朋友他们项目用了spring-boot,以spring-boot-parent作为parent:
org.springframework.boot spring-boot-starter-parent 2.0.9
女朋友最近想用elasticsearch作为搜索引擎,在项目中添加了依赖
org.elasticsearch elasticsearch 7.10.2
写好代码,一跑,报类不存在异常:
java.lang.NoClassDefFoundError:org/elasticsearch/common/xcontent/DeprecationHandler atcom.lv.springboot.datasource.ClientUTis.main(ClientUTis.java:13) Causedby:java.lang.ClassNotFoundException:org.elasticsearch.common.xcontent.DeprecationHandler atjava.net.URLClassLoader.findClass(URLClassLoader.java:381) atjava.lang.ClassLoader.loadClass(ClassLoader.java:424) atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) atjava.lang.ClassLoader.loadClass(ClassLoader.java:357) ...1more
女朋友看了依赖mvndependency:tree,发现依赖的elasticsearch版本是:
org.elasticsearch.client:elasticsearch-rest-high-level-client:7.0.1 |--org.elasticsearch:elasticsearch:5.6.16 |--org.elasticsearch.client:elasticsearch-rest-client:7.0.1 |--org.elasticsearch.plugin:parent-join-client:7.0.1 |--org.elasticsearch.plugin:aggs-matrix-stats-client:7.0.1 |--org.elasticsearch.plugin:rank-eval-client:7.0.1 |--org.elasticsearch.plugin:lang-mustache-client:7.0.1
女朋友很着急,明明指定了elasticsearch的依赖了啊,而且是项目的根pom,依赖不是最短路径原则么?不应该以这个依赖为准么?
女朋友于是找我求助,本着面向“对象”,我立马放下手头工作帮忙查看。仔细一看,原来SpringBoot的DependencyManagement中,org.elasticsearch:elasticsearch已经被包含了(以下为节选):
org.springframework.boot spring-boot-dependencies 2.0.9.RELEASE 5.6.16 org.elasticsearch elasticsearch ${elasticsearch.version}
spring-boot其实已经考虑到用户可能要换版本了,所以将版本放入了
7.10.2
所有可以这么替换的属性,spring-boot官方文档已经列出了,参考官方文档附录:VersionProperties
也可以通过dependencyManagement的最短路径原则,通过在你的项目根pom中的增加想修改依赖的dependencyManagement即可:
org.elasticsearch elasticsearch 7.10.2
最后,可以记住下面的原则,就知道项目的依赖到底是哪个版本啦:
Maven依赖可以分为如下几部分:
- 直接依赖,就是本项目dependencies部分的依赖
- 间接依赖,就是本项目dependencies部分的依赖所包含的依赖
- 依赖管理,就是本项目dependencymanagement里面的依赖
- parent的直接依赖
- parent的间接依赖
- parent的依赖管理
- bom的直接依赖(一般没有)
- bom的间接依赖(一般没有)
- bom的依赖管理
可以这么理解依赖:
1.首先,将parent的直接依赖,间接依赖,还有依赖管理,插入本项目,放入本项目的直接依赖,间接依赖还有依赖管理之前
2.对于直接依赖,如果有version,那么就依次放入DependencyMap中。如果没有version,则从依赖管理中查出来version,之后放入DependencyMap中。key为依赖的groupId+artifactId,value为version,后放入的会把之前放入的相同key的value替换
3.对于每个依赖,各自按照1,2加载自己的pom文件,但是如果第一步中的本项目dependencymanagement中有依赖的版本,使用本项目dependencymanagement的依赖版本,生成TransitiveDependencyMap,这里面就包含了所有的间接依赖。
4.所有间接依赖的TransitiveDependencyMap,对于项目的DependencyMap里面没有的key,依次放入项目的DependencyMap
5.如果TransitiveDependencyMap里面还有间接依赖,那么递归执行3,4。
由于是先放入本项目的DependencyMap,再去递归TransitiveDependencyMap,这就解释了maven依赖的最短路径原则。
Bom的效果基本和Parent一样,只是一般限制中,Bom只有dependencyManagement没有dependencies
解决了问题并且给妹子梳理明白之后,妹子答应这个月多给我100块零用钱啦,开心~~~~~
以上就是maven依赖版本没有生效的解决方案的详细内容,更多关于maven依赖版本没有生效的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。