Eclipse Maven依赖缺失问题解决

这段时间一直很忙,项目还有生活上的事,期间也看了一些书,主要是网络连接方面的,对TCP处理以及整个网络的架构有了一定的了解。但是简单的总结感觉意义不大,后面如果遇到问题再具体分析写下总结。此次写一个自己近期遇到的小问题,大体如下:

上周我们组的同事反映海外收付款工程编译报错,很多maven依赖的jar包在eclipse里面没有了,包括最常用的commons-lang3包,还有很多其他包,缺失的包也没什么明显特征。这个问题比较突然,一直以来都没问题,其他境内的工程也没问题。我们仔细想了一下,近期也没改什么东西,除了把这个海外收付款开发流重新复制一个之外(不过问题应该和这个无关)。

我尝试运行了mvn dependency:tree显示能看到commons-lang3包,其他包也有。那这个依赖关系和正常工程比对了一下,有个别公共基础包版本不一致,但缺失的包版本都是一致的。

为了进一步缩小问题的排查点,我决定将出错工程的parent pom文件改成正常工程的样子,这时发现还是报错,而且还出现了新的错误,有一个包由于版本不对,导致编译错误。看来问题不在这,我又仔细看了maven的build日志,发现个问题,日志中download的公共包的pom文件版本不太对,有些是3.3-hw版,有些是3.3.11-hw版本(maven有一个警告,版本号中包含表达式,不是常量)。看来很可能是版本的问题。

又进一步进行了排查,此海外工程的版本为3.3.11且parent pom文件版本也是3.3.11;不一致的3.3版本是因为海外工程显示声明依赖一个vo包,这个包的版本是3.3,且这个vo包的parent pom文件的版本也是3.3,但这个parent pom文件和海外工程的parent pom名称相同。也就是说海外工程同时依赖了两个不同的parent pom文件,所以日志中才会出现两个不同的版本号。具体如下图所示:

异常依赖示意图

问了下配置管理员,是因为当时图省事,没有对vo重新打包新版本。这个肯定有问题,我们把vo包重新打了新版本,海外出错工程的pom文件也修改正确。然后发现eclipse中maven缺失的依赖回来了,问题解决了 ^_^

看来这个是由于maven版本依赖冲突导致的问题,后来有研究了一些maven的资料1 2。发现其实maven有一套自己的版本冲突解决策略,所以在执行mvn dependency:tree时可以看到基本正确的依赖树,一般程序也没问题。但版本冲突总是有害的,那怎么才能显示出所有的冲突的依赖呢?

可以执行下面的命令:mvn dependency:tree -Dverbose,增加了这个选项,maven会显示出完整的依赖包,且会标出哪些是重复的依赖(omitted for duplicate),哪些是冲突的(omitted for conflict)。对于冲突的可以手工解决,例如使用exclude选项。

其实我感觉此次依赖缺失的问题更像是eclipse 或是maven插件的bug,不能正确处理依赖冲突。大家如果后面遇到这种问题也可以看看是不是maven版本依赖冲突导致的。

参考资料:

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

留言:

(lesstile enabled - surround code blocks with ---)