实际上手体验maven面对冲突Jar包的加载规则

💡 原文中文,约4400字,阅读约需11分钟。
📝

内容提要

本文讨论了Maven处理不同版本的Jar包冲突时的加载原则,包括最短路径原则和声明优先原则。文章通过实际场景验证了这些原则,并总结了常见的Jar包加载冲突异常。

🔎

延伸解读

最短路径原则的适用条件

文章指出,最短路径原则仅在项目中存在两级及以上不同依赖时生效。例如,common模块间接引入elasticsearch-rest-client 7.4.2,而service模块直接引入6.8.13,由于直接依赖路径更短,Maven最终加载6.8.13。这提醒开发者,间接依赖的版本可能被更短路径的依赖覆盖,需留意依赖树中的路径长度。

声明顺序对依赖仲裁的影响

对于多级同级依赖,先声明的依赖会覆盖后声明的依赖;而在同级依赖中,后声明的依赖反而会覆盖先声明的。文章通过调整common和service模块的声明顺序,以及直接声明两个不同版本es-rest-client的顺序,验证了这两种相反规则。因此,调整pom中依赖的声明顺序可能改变实际加载的版本,需谨慎对待。

依赖冲突的典型异常信号

文章列举了Jar包冲突后常见的四种异常:ClassNotFoundException、NoSuchMethodError、NoClassDefFoundError和LinkageError。这些异常通常在程序启动或运行时抛出,能直观表征依赖加载冲突。开发者遇到这些异常时,可优先排查是否存在不同版本的同一依赖被同时引入。

❓

Q&A

Maven如何处理Jar包冲突问题?

Maven通过最短路径原则和声明优先原则来处理Jar包冲突问题。

什么是最短路径原则?

最短路径原则是指在多级依赖中,优先选择路径最短的依赖进行加载。

声明优先原则是如何工作的?

声明优先原则是指在同级依赖中,先声明的依赖会覆盖后声明的依赖。

Jar包冲突会导致哪些常见异常?

常见的异常包括ClassNotFoundException、NoSuchMethodError、NoClassDefFoundError和LinkageError。

如何验证Maven的加载原则?

可以通过构造不同的依赖场景并观察实际加载的Jar包版本来验证Maven的加载原则。

在同级依赖中,后声明的依赖会如何影响加载?

在同级依赖中,后声明的依赖会覆盖先声明的依赖,导致先声明的依赖不被加载。

🏷️

标签

➡️

继续阅读