maven多模块项目通过父pom统一管理依赖版本、插件配置和构建行为,实现一键打包、测试与部署。核心步骤包括:父工程packaging设为pom、用<modules>聚合子模块、<dependencymanagement>锁死依赖版本、<pluginmanagement>统编译参数、子模块通过<parent>继承,并支持mvn clean compile等聚合命令自动按序构建。

你需要在大型Java项目中统一管理依赖版本、插件配置和构建行为,避免每个模块重复写spring-boot-dependencies版本号或编译Java 17的参数,同时要求所有模块能一键打包、测试、部署——这正是Maven多模块架构与父POM继承要解决的核心问题。
创建父工程:先建空壳再定义聚合能力
第一步:用IDE(如IntelliJ IDEA)新建一个Maven项目,ArtifactId设为parent-project,GroupID按团队规范填写(例如com.example),【关键前提:Packaging必须选pom,且创建后立即删除src目录】。
第二步:打开生成的pom.xml,确认<packaging>pom</packaging>已存在,这是父工程能作为聚合器的硬性要求;若缺失,手动补上并保存。
第三步:在<project></project>标签内添加<modules></modules>区块,列出未来要纳入管理的子模块路径(路径是相对于父pom.xml的相对路径):<modules><br> <module>user-service</module><br> <module>order-service</module><br> <module>common-utils</module><br></modules>
配置依赖统一管理:用dependencyManagement锁死版本
在父pom.xml的<dependencymanagement></dependencymanagement>区块中声明所有子模块可能用到的依赖及其精确版本,注意这里只是“声明管理”,不会实际引入任何jar包:
<dependencymanagement><br> <dependencies><br> <dependency><br> <groupid>org.springframework.boot</groupid><br> <artifactid>spring-boot-dependencies</artifactid><br> <version>3.3.2</version><br> <type>pom</type><br> <scope>import</scope><br> </dependency><br> <dependency><br> <groupid>com.fasterxml.jackson.core</groupid><br> <artifactid>jackson-databind</artifactid><br> <version>2.15.3</version><br> </dependency><br> </dependencies><br></dependencymanagement>
⚠️ 注意:如果子模块直接写<dependencies></dependencies>引入jackson-databind却不声明version,Maven会自动采用此处定义的2.15.3;但若子模块自己写了version,就会覆盖父级声明——这恰恰是可控的例外机制,不是bug。
子模块接入父工程:三步完成继承链绑定
方法一:手工编辑子模块pom.xml
在子模块(如user-service)的pom.xml顶部,插入<parent></parent>节点,内容严格匹配父工程坐标:<parent><br> <groupid>com.example</groupid><br> <artifactid>parent-project</artifactid><br> <version>1.0.0-SNAPSHOT</version><br></parent>
方法二:IDE快捷操作(以IntelliJ为例)
右键子模块 → Maven → Add Dependency → 在弹窗中勾选“Add as parent” → 从列表选择parent-project → 点击OK。IDE会自动生成上述<parent></parent>代码并刷新项目结构。
方法三:命令行快速初始化(适用于脚手架场景)
在父工程根目录执行:mvn archetype:generate -DgroupId=com.example -DartifactId=user-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
然后手动将新生成的pom.xml中<parent></parent>块补全——此法适合批量创建初始模块。
插件统一配置:让所有模块编译目标一致
第一步:在父pom.xml的<build></build>→<pluginmanagement></pluginmanagement>下定义maven-compiler-plugin的通用参数:
<pluginmanagement><br> <plugins><br> <plugin><br> <groupid>org.apache.maven.plugins</groupid><br> <artifactid>maven-compiler-plugin</artifactid><br> <version>3.13.0</version><br> <configuration><br> <source>17</source><br> <target>17</target><br> </configuration><br> </plugin><br> </plugins><br></pluginmanagement>
第二步:在每个子模块的<build></build>→<plugins></plugins>中显式启用该插件(不写version):<plugins><br> <plugin><br> <groupid>org.apache.maven.plugins</groupid><br> <artifactid>maven-compiler-plugin</artifactid><br> </plugin><br></plugins>
这样既保证了编译一致性,又避免了子模块各自维护插件版本带来的升级遗漏风险。
验证聚合构建:一键触发全模块生命周期
① 打开终端,cd进入父工程根目录(即含parent-project/pom.xml的目录);
② 执行mvn clean compile——Maven会按模块间依赖关系自动排序,依次对common-utils → user-service → order-service执行清理和编译;
③ 执行mvn test——所有子模块的src/test/java下的测试类将被并行执行;
④ 执行mvn package——各模块按自身<packaging></packaging>类型分别生成jar或war包,全部输出到各自target/目录下。











