Maven dependencyManagement:从父级继承依赖版本

Zot*_*tov 8 maven-3 maven

我想我的依赖dependencyManagement块继承从一个版本spring-boot-parentdependencyManagement块,但增加排斥它,这样我就不必指定每个儿童模块排除。

我的父 pom 继承自 spring-boot-parent:

  <artifactId>my-parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/>
  </parent>
  <dependencyManagement>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>???</version>
        <exclusions>
          <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
  </dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

子 pom 继承my-parent

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
  </dependencies>
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法:

  • 当我替换???为 时${parent.version},在子模块中,此版本被解析为my-parent's version: 1.0.0-SNAPSHOT,这是不正确的。

  • 当我用 替换???${parent.parent.version},maven 会中断,因为它不支持此类属性

  • 我可以修复???2.0.1.RELEASE,这将正常工作,但如果我更新春天启动的版本,我记得更新这种依赖性也的版本,这是不直观

  • 我无法提取2.0.1.RELEASE作为属性my-parent并将该属性用作父版本,因为 maven 不支持。

  • 我可以使用具有2.0.1.RELEASEspring-boot-parentpom继承的值的属性,但据我所知,没有这样的属性。

有没有一种很好的方法来实现我想要的?

Zac*_*son 2

请参阅是否可以将父版本作为属性提供给子项?- 用于声明父级的版本不能以“将此引用固定为表示其在图中此时的解释”的方式重新调整用途。字符串是字符串,占位符是占位符;没有内置的设施来进行某种中间的事情。如果父级使用属性来定义依赖项版本,您可以引用该属性;如果它使用固定字符串(如您的情况),那么您需要重复某些内容才能定义排除。正如链接问题中所提到的,常见的方法是这样的:

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
  </parent>
  <properties>
    <spring.boot.version>2.0.1.RELEASE</spring.boot.version>
  </properties>
  <dependencyManagement>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>${spring.boot.version}</version>
      <exclusions>
        ...
Run Code Online (Sandbox Code Playgroud)

您仍然必须在两个字段中重复该值 - 因此您必须确保始终保持这些字段同步(版本和属性)。

然而,越来越流行的管理方法是在 BOM(“物料清单”pom,其特定目的是保持一组组件对齐)中声明这些版本。然后这些dependencyManagement东西就可以被导入而不是继承。Spring Boot 这样做已经有一段时间了;事实上,您示例中的父级实际上并未声明依赖项本身,它们来自不同的工件。因此,您可以做这样的事情,而不是从父级继承(我可能有这些向后的顺序——我不记得是第一个还是最后一个获胜):

  <properties>
    <spring.boot.version>2.0.1.RELEASE</spring.boot.version>
  </properties>
  <dependencyManagement>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${spring.boot.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>${spring.boot.version}</version>
      <exclusions>
        ...
Run Code Online (Sandbox Code Playgroud)

...现在,如果您想继承其他原因(除了 dep mgmt 之外),spring-boot-starter-parent那么这不会真正帮助您解决问题;您仍然需要复制。但我怀疑,随着你的项目的成熟,你无论如何都会希望有一个自己设计的父母。