项目和BOM依赖项之间有什么区别?

时间:2020-05-15 06:19:32

标签: java spring-boot maven gradle repository

我注意到Kubernetes客户端的fabric8.io具有两个依赖关系,以项目和BOM结尾。

我注意到的唯一区别是它首先具有分布式版本。同样根据Apache指南,BOM通常用作项目的父项。

还有其他用途/区别吗?我应该在Spring Boot中使用哪个依赖项?

1 个答案:

答案 0 :(得分:2)

BOM项目既可以用作Maven模块的父级,也可以导入为BOM依赖关系,从而使您可以从该BOM导入依赖关系。可以在here上找到有关此问题的非常好的文章。

BOM为什么重要?由于您已在问题中添加了Spring标记,因此,假设您要使用某个特定的Spring版本,并且component_1可以与component_2一起使用,只要它们具有相同的版本即可。作为库开发人员,您将拥有一个包含组件_1和组件_2的版本化物料清单,并且在您的项目中,您将需要导入具有所需版本的物料清单以及不包含该版本的所需组件,因为该物料清单将继承自导入的产品BOM /父级。这正是Spring所做的。

万一上面的链接将来无法使用,这是带有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的版本即可。