在大型maven多模块项目中,通常会采用父子pom结构来管理各个子模块。然而,一个常见的痛点是,即使子模块继承了父pom,它们仍然需要为每个依赖项明确指定版本,即使这些依赖项的版本已经在父pom中定义过。这导致了版本信息在多处冗余,一旦某个依赖的版本需要升级,就需要在所有使用到它的子模块中逐一修改,这不仅效率低下,还极易引入版本不一致的问题。
例如,如果父POM中已经定义了fisgar-model的某个版本,但在子POM中仍然需要像下面这样显式声明:
<dependency> <groupId>br.com.fisgar</groupId> <artifactId>fisgar-model</artifactId> <version>${project.version}</version> <!-- 仍需指定版本 --> </dependency>
理想情况下,我们希望像Spring Boot Starter Parent那样,子模块只需声明依赖而无需指定版本,由父POM统一管理,例如:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 版本由父POM管理,此处无需指定 --> </dependency>
Maven提供了一个强大的机制来解决这个问题,那就是在父POM中使用
在你的父POM(parent.pom)中,添加
父POM示例 (parent.pom):
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yourcompany</groupId> <artifactId>your-parent-project</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <!-- 父POM通常是pom类型 --> <name>Your Parent Project</name> <description>Centralized dependency management for all sub-modules</description> <properties> <!-- 可以在这里定义版本属性,方便管理和升级 --> <fisgar-model.version>1.2.3</fisgar-model.version> <slf4j.version>1.7.32</slf4j.version> <junit.version>5.8.2</junit.version> </properties> <dependencyManagement> <dependencies> <!-- 声明 fisgar-model 依赖及其版本 --> <dependency> <groupId>br.com.fisgar</groupId> <artifactId>fisgar-model</artifactId> <version>${fisgar-model.version}</version> </dependency> <!-- 声明 SLF4J API 依赖及其版本 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <!-- 声明 JUnit 依赖及其版本 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- 更多需要统一管理的依赖... --> </dependencies> </dependencyManagement> <build> <pluginManagement> <!-- 插件管理也可以类似地集中在这里 --> </pluginManagement> </build> <modules> <!-- 如果有子模块,在这里声明 --> <!-- <module>your-child-module</module> --> </modules> </project>
在上述父POM中,我们通过
子模块的POM只需要继承这个父POM,并在自己的
子POM示例 (child.pom):
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.yourcompany</sgroupId> <artifactId>your-parent-project</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>your-child-module</artifactId> <packaging>jar</packaging> <name>Your Child Module</name> <description>A sub-module using managed dependencies</description> <dependencies> <!-- 引用 fisgar-model,版本由父POM的 dependencyManagement 管理 --> <dependency> <groupId>br.com.fisgar</groupId> <artifactId>fisgar-model</artifactId> <!-- 注意:此处无需指定版本 --> </dependency> <!-- 引用 SLF4J API,版本由父POM的 dependencyManagement 管理 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <!-- 注意:此处无需指定版本 --> </dependency> <!-- 引用 JUnit,版本由父POM的 dependencyManagement 管理 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <!-- 注意:此处无需指定版本 --> </dependency> <!-- 更多实际使用的依赖... --> </dependencies> </project>
通过这种方式,当your-child-module需要fisgar-model时,它只需要声明其groupId和artifactId。Maven在解析这个POM时,会向上查找父POM的
版本覆盖: 如果子模块在自己的
<dependencies> <dependency> <groupId>br.com.fisgar</groupId> <artifactId>fisgar-model</artifactId> <version>2.0.0</version> <!-- 显式指定版本,将覆盖父POM的1.2.3 --> </dependency> </dependencies>
使用属性管理版本: 推荐在父POM的
<properties> <spring.version>5.3.20</spring.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement>
传递性依赖:
通过在Maven父POM中有效利用
以上就是Maven项目依赖版本统一:掌握dependencyManagement的精髓的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号