场景:父 pom 中声明了 dependencyManagement ,子 pom 中也声明了 dependencyManagement ,且父子pom中都定义了某个artifacId。
父 子 POM 中 声明的artifactId 版本是否相同? |
子 POM版本号 是否可省略? |
最终使用 哪个版本? |
说明 |
相同 | 可以 | 父pom中定义的 |
这种机制有助于简化子 POM 中的依赖管理,使版本号的定义更加集中和统一。 在子 POM 中,不需要重复声明已经在父 POM 的 可减少冗余和版本不一致的风险。 |
不同 | 不可以 | 子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>

<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 会自动继承父 POM 中所有在
dependencyManagement
中声明的依赖及其版本号。这意味着子 POM 不需要重复声明这些版本号。
- 子 POM 会自动继承父 POM 中所有在
-
减少冗余:
- 在子 POM 的
dependencyManagement
中声明与父 POM 相同的依赖时,可以省略版本号,Maven 会使用父 POM 中的版本号。这减少了重复声明,避免了版本不一致的风险。
- 在子 POM 的
-
版本覆盖:
- 如果子 POM 中需要覆盖父 POM 中依赖的版本,可以在子 POM 的
dependencyManagement
中重新声明该依赖并指定新的版本号。
- 如果子 POM 中需要覆盖父 POM 中依赖的版本,可以在子 POM 的
示例:覆盖父 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>
通过这种方式,你可以灵活地管理和覆盖多模块项目中的依赖版本,并确保版本号的集中管理和一致性。