maven打包时的三⽅包的选择顺序
在⼀个项⽬有多个模块引⽤多个版本的某个插件(或者叫三⽅包、jar包等)时,如何解决版本冲突问题?最终选⽤某个版本还是选择⼏个版本?
maven在遇到上⾯的情况时,会智能处理版本冲突,最终选择⼀个版本,选取的原则是:
1、就近原则:根据依赖路径最短选择版本
2、路径相同选择最先出现的,及第⼀声明原则
那么问题来了,当有多个模块引⽤同⼀个版本时,如何查看依赖路径?如果路径长度相同,哪个最先出现?
⾸先在根pom或者⽗pom中引⼊maven-dependency-plugin这个插件,在项⽬的根⽬录执⾏命令mvn dependency:tree可以查看jar包的依赖顺序,如图,可以清楚的查看某个jar 的依赖路径;
使⽤命令mvn dependency:tree -Dverbose可以查看查看更详细的信息,主要是告诉你那些版本因为冲突⽽被忽略
使⽤mvn dependency:list,可以列出依赖的所有jar包
执⾏错误的命令,可以查看这个插件的所有命令:项⽬中,我常⽤mvn dependency:copy-dependencies -DoutputDirectory=~/dependencies命令把项⽬的所有依赖拷贝到⼀个⽬录⾥。
但是这个⽅法存在⼀个问题:就是它只解决模块内部的版本冲突,并没有解决项⽬各个模块之间的依赖冲突,因此有的时候会存在多个jar包的现象,以⾄于你也说不清⽤户最终使⽤的是哪个版本的jar包,也就⽆法明确判断⽤户使⽤的jar包到底违不违反部门确定的“必须使⽤某个jar包的规定”
maven打包本地jar包联想:pip install pyquery==2.2.222222⼀个错误的版本号,通过错误信息,你可以看到所有⽀持的正确的版本,这样再选择⼀个正确的版本
为了解决mvn dependenc:copy-dependencies上⾯存在的多个版本的问题,⼀个⽐较笨拙的解决办法是:使⽤mvn depedency:tree > 把依赖及依赖路径信息拷贝到某个⽬录,然后使⽤py脚本把这些⽬录的内容存⼊数据库,当遇到多个版本的情况时,把这些⾥的内容再拿出来,进⾏分析:
分析⽅法就是,对进⾏每⾏匹配,到某个插件出现在路径⾥的顺序以及版本号信息,到那个maven最终使⽤的版本
如图,通过查看版本名字和‘[INFO]’之间字符的个数来确定路径,1个字符是路径值是1,4个字符路径值是2,依次类推。
DoutputDirectory=~/dependencies,这样就可以得到项⽬最终的依赖列表。⽐如下⾯的项⽬⽬录下的web⽬录就是项⽬最终打包的配置

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。