maven多模块项目需确保父pom的packaging为pom、正确配置modules路径、子模块显式声明parent并省略version;构建时maven按依赖顺序自动编译各模块。

你想在一天内跑通一个能编译、能依赖、能一键构建的Maven多模块项目,而不是卡在父POM报错、子模块找不到parent、或者mvn clean install直接失败——这需要避开初学者最常踩的三个坑:packaging没设成pom、modules路径写错、子模块里漏了parent声明。
创建根父模块(纯配置型)
用命令行在任意空目录下执行:mvn archetype:generate -DgroupId=com.example -DartifactId=myapp-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false。
进入生成的myapp-parent目录,打开pom.xml,把<packaging>jar</packaging>改成<packaging>pom</packaging>——【不改这一项,后续所有子模块都无法继承,Maven会直接忽略parent配置】。
删掉src目录——父模块只管协调,不放任何Java代码,留着反而会让IDE误判为可运行模块。
添加子模块(按职责分层)
在myapp-parent目录下,依次执行三条命令创建三个典型子模块:
mvn archetype:generate -DgroupId=com.example -DartifactId=myapp-common -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0-SNAPSHOT -DinteractiveMode=false
mvn archetype:generate -DgroupId=com.example -DartifactId=myapp-service -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0-SNAPSHOT -DinteractiveMode=false
mvn archetype:generate -DgroupId=com.example -DartifactId=myapp-web -DarchetypeArtifactId=maven-archetype-webapp -Dversion=1.0-SNAPSHOT -DinteractiveMode=false
注意:web模块必须用maven-archetype-webapp,否则缺少web.xml骨架和src/main/webapp路径,后期集成Spring Boot会报错。
配置父POM的聚合与统一管理
打开myapp-parent/pom.xml,在<project></project>标签内,紧挨<version></version>下方插入<modules></modules>块:
<modules><module>myapp-common</module><module>myapp-service</module><module>myapp-web</module></modules>
在<properties></properties>里定义Java版本和编码:<java.version>17</java.version><project.build.sourceencoding>UTF-8</project.build.sourceencoding>。
在<dependencymanagement></dependencymanagement>中声明Spring Boot Web依赖(版本号由父POM锁定):<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-web</artifactid><version>3.3.2</version></dependency>——子模块引用时不用写<version></version>,写就反而会覆盖父级管理。
修正每个子模块的pom.xml
第一步:打开myapp-common/pom.xml,在<project></project>开头插入<parent></parent>块:
<parent><groupid>com.example</groupid><artifactid>myapp-parent</artifactid><version>1.0-SNAPSHOT</version><relativepath>../pom.xml</relativepath></parent>
第二步:删掉子模块pom里自动生成的<version>1.0-SNAPSHOT</version>——它必须由父POM统一控制,子模块里出现就是冗余且易冲突。
第三步:在myapp-service/pom.xml的<dependencies></dependencies>中添加对common的依赖:<dependency><groupid>com.example</groupid><artifactid>myapp-common</artifactid></dependency>——【不写version,否则破坏继承机制】。
第四步:在myapp-web/pom.xml中,除了<parent></parent>声明,还要确保<packaging></packaging>是war(archetype已设好),并在<dependencies></dependencies>里同时引入service和web starter:<dependency><groupid>com.example</groupid><artifactid>myapp-service</artifactid></dependency> → <dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-web</artifactid></dependency>。
验证构建是否成功
回到myapp-parent根目录,执行:mvn clean install -Dmaven.test.skip=true。
观察控制台输出:Maven会先构建myapp-common,再构建myapp-service(因依赖common),最后构建myapp-web(因依赖service)——顺序由依赖关系决定,不是<modules></modules>里的排列顺序。
检查myapp-parent/target下无任何jar包(父模块不产出构件),而myapp-common/target/myapp-common-1.0-SNAPSHOT.jar、myapp-service/target/myapp-service-1.0-SNAPSHOT.jar、myapp-web/target/myapp-web-1.0-SNAPSHOT.war均存在且大小非零。











