深入探讨:Maven中的物料清单

2019年6月4日 阿尤什·普拉沙(Ayush Prashar)Java项目管理材料清单依赖管理MavenMaven插件

阅读时间: 3 分钟

最近,在使用Spring WebFlux时,我遇到了一个非常有用的物料清单概念,也称为BOM表( bill of materials),这个概念实际上并不仅限于Spring。BOM 是 Spring 帮助我们忘记与传递依赖项有关的问题,把注意力放到关注项目需求的几种方法之一。

因此,当我们通常创建一个具有数十个或数百个依赖项的大型项目时,很大可能使用传递性依赖项是在项目内部使用的通用项。因此,假设我们有一个称为 “common-3.0.0.RELEASE” 的依赖项,它由日志记录的工件使用,而测试框架使用的 “common-2.9.0.Release”这个版本。在这种情况下就会有冲突。我们需要确保获得可用的版本,以便两个工件可以协同工作。

Maven 有一种为我们解决这个问题的方法。它使用依赖关系调解(dependency mediation)的概念。它用一个被称为依赖项的路径的概念。拥有最短项目路径的包将被其他包选中。假设在我们的例子中,依赖链类似于 log4j -> commons-2.9.0.Release 和 JUnit -> unit-tests -> common.3.0.0., Maven 选择commons 2.9,因为它的依赖路径距离当前 POM 更短。

但是,当我们可以搞对时,为什么要依靠某种外部方法呢?通过在 POM 中指定它,我们始终可以使用我们希望的甚至可以过渡的版本。当然,但这会使我们的 POM 混乱,因为我们要写入的可能会很多。 我们可以让依赖管理(dependency management )来控制,也许是一个更好的办法。

物料清单

Maven 让我们在单独的 pom 中定义依赖项或传递性依赖项的版本。在此 pom 中,我们声明了依赖项的版本和范围。因此,我们可以集中讨论所有依赖项细节。

让我们创建一个示例物料清单 pom 文件。

2019-06-04 15-08-09的屏幕截图

可以看出,物料清单是一个完全正常的 POM 文件,我们可以在其中包含依赖项信息。

如何使用它?

现在我们了解到,BOM是一个文件,其中包含有关我们项目的任何依赖项版本的所有信息。下一步是将此文件包含在我们的原始POM中。

一种做到这一点的方式就是Spring的方式,就像父项目一样继承它。我们需要做的就是在父标记中提供父信息。

2019-06-04 15-09-21的屏幕截图

尽管这是 Spring 的工作方式,但我们不能从多个父pom继承。因此,如果您希望从多个继承,我们会在依赖项中传递凭据。

2019-06-04 15-03-57的屏幕截图

优先级

因此,有多种确定版本的方法,这意味着有一个优先顺序。

  1. 在POM中直接声明中提供的版本具有最高优先级。
  2. 父pom中提供的版本具有第二优先权。
  3. 导入的pom版本排名第三
  4. 最后,我们从依赖关系调解中得到的版本

如果在继承多个 pom 时发生冲突,则按顺序更早声明的依赖项优先。

因此,现在您可以了解为什么在Spring pom中可以进行神奇的自动配置,BOM是什么, 以及在需要进行指定版本的情况下该怎么做。

参考:

Maven Doc

Maven基础


Yujiaao
12.7k 声望4.7k 粉丝

[链接]