场景:父 pom 中声明了 dependencyManagement ,子 pom 中也声明了 dependencyManagement ,且父子pom中都定义了某个artifacId。

父 子 POM 中 dependencyManagement 

声明的artifactId 版本是否相同?

子 POM版本号

是否可省略?

最终使用

哪个版本?

说明
相同 可以 父pom中定义的

这种机制有助于简化子 POM 中的依赖管理,使版本号的定义更加集中和统一。

在子 POM 中,不需要重复声明已经在父 POM 的 dependencyManagement 部分中定义的版本号,

可减少冗余和版本不一致的风险。

不同 不可以 子pom中定义的  

 

示例:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>parent-project</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <!-- Parent POM Dependency Management -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.5.4</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.5.4</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>
父 POM (parent/pom.xml):

 

<project>
  <parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
  </parent>

  <modelVersion>4.0.0</modelVersion>
  <artifactId>child-project</artifactId>

  <!-- Child POM Dependency Management -->
  <dependencyManagement>
    <dependencies>
      <!-- This dependency can omit the version as it is inherited from the parent POM -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <!-- This dependency can omit the version as it is inherited from the parent POM -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- Using the managed dependencies without specifying the version -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
  </dependencies>
</project>
子 POM (child/pom.xml):

总结:

  1. 继承机制

    • 子 POM 会自动继承父 POM 中所有在 dependencyManagement 中声明的依赖及其版本号。这意味着子 POM 不需要重复声明这些版本号。
  2. 减少冗余

    • 在子 POM 的 dependencyManagement 中声明与父 POM 相同的依赖时,可以省略版本号,Maven 会使用父 POM 中的版本号。这减少了重复声明,避免了版本不一致的风险。
  3. 版本覆盖

    • 如果子 POM 中需要覆盖父 POM 中依赖的版本,可以在子 POM 的 dependencyManagement 中重新声明该依赖并指定新的版本号。

示例:覆盖父 POM 的版本号

如果子 POM 需要覆盖父 POM 中声明的版本号,可以在子 POM 中重新指定版本号:

<project>
  <parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
  </parent>

  <modelVersion>4.0.0</modelVersion>
  <artifactId>child-project</artifactId>

  <!-- Child POM Dependency Management -->
  <dependencyManagement>
    <dependencies>
      <!-- Overriding the version from the parent POM -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.3</version> <!-- New version specified -->
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- Using the managed dependencies with overridden version -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
</project>
覆盖父 POM 的版本号

通过这种方式,你可以灵活地管理和覆盖多模块项目中的依赖版本,并确保版本号的集中管理和一致性。

posted on 2024-11-14 16:35  卡米i  阅读(43)  评论(0)    收藏  举报