项目和 BOM 依赖项之间有什么区别?
Whats the difference between project and BOM dependencies?
我注意到 fabric8.io for Kubernetes 客户端有两个以项目和 BOM 结尾的依赖项。
我注意到的唯一区别是它首先有一个分布式版本。同样根据 apache 指南,bom 通常用作项目的父项。
还有其他的uses/differences吗? Spring Boot 我应该使用哪个依赖项?
BOM 项目既可以用作 Maven 模块的父级,也可以作为 BOM 依赖项导入,这样您就可以从该 BOM 导入依赖项。可以找到一篇关于这个问题的非常好的文章 here。
为什么 BOM 很重要?由于您在问题中添加了 Spring 标签,假设您想使用某个 Spring 版本并且 component_1 可以与 component_2 一起正常工作,只要它们具有同一个版本。作为库开发人员,您将拥有一个包含 component_1 和 component_2 的版本化 BOM,并且在您的项目中,您需要导入包含所需版本的 BOM 以及没有版本所需的组件,因为它将继承自您导入的 BOM/parent。这正是 Spring 所做的。
如果上面的 link 将来不起作用,这里是 BOM 的基本工作流程。
// BOM project
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>baeldung</groupId>
<artifactId>Baeldung-BOM</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>BaelDung-BOM</name>
<description>parent pom</description>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>a</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>test</groupId>
<artifactId>b</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>test</groupId>
<artifactId>c</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
// importing the BOM in your project
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>baeldung</groupId>
<artifactId>Test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Test</name>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>baeldung</groupId>
<artifactId>Baeldung-BOM</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<dependency>
<groupId>test</groupId>
<artifactId>b</artifactId>
<!-- version and scope omitted, inherited from the BOM, 1.0 and compile (you can override them here, but that defeats the purpose) -->
</dependency>
</dependencies>
</project>
请注意,导入 BOM 不会添加在 dependencyManagement
部分中指定的所有依赖项,除非您将它们添加到项目的 dependencies
部分中。它就像一个产品目录,它向您展示了 BOM 为您提供的内容。
Here 是 Spring Boot 2.3.0 依赖项 pom.xml,其中 dependencyManagement
部分用于查看真实世界 BOM 的外观(或者只是父级,如果你想要)。
如果你曾经想使用 Spring 6、Hibernate 5 和 JUnit 5 & Assertion lib 朋友,假设它们都提供 BOM,你可以包括这 3 个 BOM,每次你需要升级Spring 版本的项目,您只需要更新导入的 Spring BOM 版本。
我注意到 fabric8.io for Kubernetes 客户端有两个以项目和 BOM 结尾的依赖项。
我注意到的唯一区别是它首先有一个分布式版本。同样根据 apache 指南,bom 通常用作项目的父项。
还有其他的uses/differences吗? Spring Boot 我应该使用哪个依赖项?
BOM 项目既可以用作 Maven 模块的父级,也可以作为 BOM 依赖项导入,这样您就可以从该 BOM 导入依赖项。可以找到一篇关于这个问题的非常好的文章 here。
为什么 BOM 很重要?由于您在问题中添加了 Spring 标签,假设您想使用某个 Spring 版本并且 component_1 可以与 component_2 一起正常工作,只要它们具有同一个版本。作为库开发人员,您将拥有一个包含 component_1 和 component_2 的版本化 BOM,并且在您的项目中,您需要导入包含所需版本的 BOM 以及没有版本所需的组件,因为它将继承自您导入的 BOM/parent。这正是 Spring 所做的。
如果上面的 link 将来不起作用,这里是 BOM 的基本工作流程。
// BOM project
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>baeldung</groupId>
<artifactId>Baeldung-BOM</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>BaelDung-BOM</name>
<description>parent pom</description>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>a</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>test</groupId>
<artifactId>b</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>test</groupId>
<artifactId>c</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
// importing the BOM in your project
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>baeldung</groupId>
<artifactId>Test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Test</name>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>baeldung</groupId>
<artifactId>Baeldung-BOM</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<dependency>
<groupId>test</groupId>
<artifactId>b</artifactId>
<!-- version and scope omitted, inherited from the BOM, 1.0 and compile (you can override them here, but that defeats the purpose) -->
</dependency>
</dependencies>
</project>
请注意,导入 BOM 不会添加在 dependencyManagement
部分中指定的所有依赖项,除非您将它们添加到项目的 dependencies
部分中。它就像一个产品目录,它向您展示了 BOM 为您提供的内容。
Here 是 Spring Boot 2.3.0 依赖项 pom.xml,其中 dependencyManagement
部分用于查看真实世界 BOM 的外观(或者只是父级,如果你想要)。
如果你曾经想使用 Spring 6、Hibernate 5 和 JUnit 5 & Assertion lib 朋友,假设它们都提供 BOM,你可以包括这 3 个 BOM,每次你需要升级Spring 版本的项目,您只需要更新导入的 Spring BOM 版本。