假如某个工程有一个依赖A
A依赖B
而工程也直接依赖B,但是不同版本
那么写pom时,能在引入A的地方排除B不?
譬如如下写法,会导致A找不到B依赖而出问题吗?
<dependency>
A
<exclusions>
<exclusion>
B
<exclusion>
</exclusions>
</dependency>
<dependency>
B
</dependency>
###理论上不需要排除。因为最短路径优先。但是可读性相对差一点。
###不会的,新增的依赖包写在排除包之前。
###你完全可以这样做。
但由于版本不同,也需要谨慎操作。
因为这可能会给你带来一些不太直观、不好排查的问题。
举个例子:
A依赖于B功能的 xxxx.xxx.test() 函数,此函数在1.0版本中被B提供,但在1.1版本中被B移除。
此时,如果我们声明项目依赖于B的1.1版本,则A将报找不到B的 xxxx.xxx.test() 函数的异常。
当然了,以上错误不一定出现,原因有2:
- 我们声明的B版本可以完全兼容A中声明的B版本。
- 即使A调用了某个特定B版本的功能,可能在使用的过程中我们并没有去触发A的相同功能,此时也不会发生错误。
如果是为了防止版本冲突,建议在父pom通过dependencyManagement来统一版本,子pom不需要定义jar版本,pom里太多的exclusion太影响代码的可读性了
###不会,maven管理加载依赖后,找包是根据包名,而不是版本,意思就是只要项目中有这个包名,就可以找到。
实际应用中,不建议用<exclusion>
排除,
最好使用<dependencyManagement>
统一项目中的包版本。
一般来说是没事的,需要注意的就是排除的包的版本和单独新增的版本,会不会有不兼容的情况。
关注我的博客: https://www.epoooll.com/