为啥dependencyManagement中有spring-boot-dependencies?

Posted

技术标签:

【中文标题】为啥dependencyManagement中有spring-boot-dependencies?【英文标题】:Why is spring-boot-dependencies in dependencyManagement?为什么dependencyManagement中有spring-boot-dependencies? 【发布时间】:2018-04-09 14:12:40 【问题描述】:

Spring 文档Using Spring Boot without the parent POM 显示对spring-boot-dependencies 的依赖已添加到dependencyManagement 部分。这真的正确吗?

spring-boot-dependencies 为所有依赖项指定版本属性。但是,这些属性在使用 spring-boot-dependencies 的 POM 中不可用。大概是因为spring-boot-dependenciesdependencyManagement中。

spring-boot-dependencies 仅包括 dependencyManagementpluginManagement。所以似乎可以将spring-boot-dependencies 包含为依赖项(而不是dependencyManagement)而不添加不必要的依赖项。

那么为什么spring-boot-dependencies 会被包含为dependencyManagement

【问题讨论】:

我问这个问题是因为我想使用来自spring-boot-dependencies$jersey.version。从那时起,我在文档中看到,属性仅在使用 spring starter POM 作为父级时可用。 【参考方案1】:

这绝对是正确的。请看Using Spring Boot without the parent POM!

【讨论】:

已验证。将 spring-boot-dependencies 依赖项放入 dependencies` 部分会导致错误。 最新版本的文档已移至:docs.spring.io/spring-boot/docs/2.3.1.RELEASE/maven-plugin/…【参考方案2】:

那么为什么要将 spring-boot-dependencies 包含在 dependencyManagement 中呢?

假设您有一个名为projectA 的项目,并且您将spring-boot-dependencies 添加到dependencyManagement 部分的pom.xml

<project>
  <groupId>com.iovation.service</groupId>
  <artifactId>projectA</artifactId>
  <version>1.0.0-SNAPSHOT</version>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <type>pom</type>
        <version>1.5.8.RELEASE</version>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- Spring Boot Dependencies -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
      </dependency>
  ...
</project>

如果您仔细观察,您会发现在dependencies 部分下声明的所有Spring Boot 依赖项都不需要指定version。它从dependencyManagement 部分中指定的spring-boot-dependencies 版本派生version

依赖管理的优点

它通过在一处指定 Spring Boot 版本来集中依赖信息。从一个版本升级到另一个版本时,它确实很有帮助。

Spring Boot 依赖项的后续声明只提到了库名,没有任何版本。在多模块项目中特别有用

避免项目中不同版本的spring boot库不匹配。

无冲突。

【讨论】:

在我的情况下,我需要一个不包含在 Spring Boot 依赖项中的依赖项。我希望从 spring boot 依赖中“继承”版本,而不是明确地重新定义它,这样当 spring boot 升级时,我就不会忘记更新附加依赖的版本。不幸的是,属性仅在继承时可用(但不能通过依赖管理),我需要从我的项目树继承。

以上是关于为啥dependencyManagement中有spring-boot-dependencies?的主要内容,如果未能解决你的问题,请参考以下文章

maven之dependencyManagement标签

为啥在汇编输出中有这么多 iostream 样板文件?

了解 onehotencoder 的工作原理 - 为啥我在 ohe 列中有多行?

为啥 python np 数组输出中有更多的字符串? [复制]

maven中的dependencyManagement

为啥我不能在 C 中读取 Ctrl+S?