多模块项目结构设计
大型项目通常包含多个子系统或组件,如果所有代码放在一个项目中,会导致项目臃肿、构建缓慢、依赖混乱、职责不清等问题。Maven 的多模块机制将项目拆分为多个独立模块,每个模块有独立的 pom.xml,通过父 POM统一管理,实现代码复用、职责分离、并行构建。
为什么需要多模块
单模块项目的问题
XML
场景:电商系统
单模块项目结构:
ecommerce/
├── src/main/java/
│ └── com/example/
│ ├── controller/ ← Web层
│ ├── service/ ← 业务层
│ ├── dao/ ← 数据层
│ ├── model/ ← 实体类
│ ├── util/ ← 工具类
│ └── config/ ← 配置类
│ └── api/ ← API定义
│ └── admin/ ← 管理后台
│ └── mobile/ ← 移动端
└── pom.xml ← 一个巨大的pom.xml
问题:
1. 项目臃肿
- 几百个源文件
- 目录层级混乱
- IDE 加载慢
2. 构建缓慢
- 修改一个文件,整个项目重新编译
- mvn package 需要10分钟
3. 依赖混乱
- 所有代码共享依赖
- Web层依赖了DAO层不需要的库
- 移动端依赖了管理后台的库
4. 职责不清
- controller、service、dao混在一起
- 新人不知道代码在哪
5. 团队协作困难
- 多人修改同一pom.xml,容易冲突
- 不同团队职责交叉
6. 部署困难
- 只能打包成一个巨大的 jar
- 无法单独部署某个子系统
多模块项目的优势
XML
多模块项目结构:
ecommerce/
├── pom.xml ← 父 POM
├── ecommerce-common/ ← 公共模块
│ └── pom.xml
├── ecommerce-api/ ← API 模块
│ └── pom.xml
├── ecommerce-service/ ← 服务模块
│ └── pom.xml
├── ecommerce-web/ ← Web 模块
│ └── pom.xml
├── ecommerce-admin/ ← 管理后台
│ └── pom.xml
└── ecommerce-mobile/ ← 移动端
│ └── pom.xml
优势:
1. 项目清晰
- 每个模块职责明确
- 目录结构简单
2. 构建高效
- 只构建修改的模块
- 可并行构建多个模块
- 构建时间从10分钟降到2分钟
3. 依赖清晰
- 每个模块独立依赖
- Web 只依赖 service
- admin 不依赖 mobile 的库
4. 团队协作
- 不同团队维护不同模块
- pom.xml冲突减少
5. 独立部署
- web.jar、admin.jar 分别部署
- 可只升级某个模块
6. 代码复用
- common 模块被所有模块依赖
- 工具类统一管理
多模块项目结构设计
典型分层结构
XML
推荐的多模块分层结构:
┌─────────────────────────────────────────────┐
│ ecommerce-web │
│ (Web控制器、前端交互) │
└────────────────────┬────────────────────────┘
│ depends on
┌────────────────────▼────────────────────────┐
│ ecommerce-service │
│ (业务逻辑、事务管理) │
└────────────────────┬────────────────────────┘
│ depends on
┌──────────┴──────────┐
│ │
┌─────────▼─────────┐ ┌─────────▼─────────┐
│ ecommerce-dao │ │ ecommerce-api │
│ (数据访问、ORM) │ │ (接口定义、DTO) │
└─────────┬─────────┘ └─────────┬─────────┘
│ │
└──────────┬──────────┘
│ depends on
┌────────────────────▼────────────────────────┐
│ ecommerce-common │
│ (工具类、常量、基础配置) │
└─────────────────────────────────────────────┘
依赖方向:从上到下,单向传递
- web 依赖 service
- service 依赖 dao、api
- dao、api 依赖 common
- common 不依赖任何模块
项目目录结构
XML
ecommerce/
├── pom.xml # 父 POM(聚合+继承)
├── ecommerce-common/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/common/
│ │ │ ├── util/
│ │ │ ├── constant/
│ │ │ └── exception/
│ │ └── resources/
│ └── test/
│ └── java/
├── ecommerce-api/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/example/api/
│ ├── dto/
│ ├── vo/
│ └── facade/
├── ecommerce-dao/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/example/dao/
│ │ ├── entity/
│ │ ├── mapper/
│ │ └── repository/
│ └── resources/
│ └── mapper/ # MyBatis XML
├── ecommerce-service/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/example/service/
│ │ ├── impl/
│ │ ├── config/
│ │ └── aspect/
│ └── resources/
│ └── application.yml
├── ecommerce-web/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/example/web/
│ │ ├── controller/
│ │ ├── filter/
│ │ └── interceptor/
│ └── resources/
│ └── static/
│ └── templates/
└── ecommerce-admin/
├── pom.xml
└── src/
└── main/
└── java/
└── com/example/admin/
└── controller/
父 POM 配置详解
父 POM 的作用
XML
父 POM 承担两个角色:
1. 聚合(Aggregator)
- 定义所有子模块
-统一构建所有模块
- 管理构建顺序
2. 继承(Parent)
- 定义公共配置
- 统一依赖版本(dependencyManagement)
- 统一插件配置(pluginManagement)
- 子模块继承配置
父 POM 完整示例
XML
<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>ecommerce</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <!-- 父模块必须是 pom -->
<!-- ==================== 项目信息 ==================== -->
<name>Ecommerce Platform</name>
<description>电商系统多模块项目</description>
<!-- ==================== 子模块列表 ==================== -->
<!-- 聚合:定义所有子模块 -->
<modules>
<!-- 模块顺序不影响构建顺序 -->
<!-- Maven 自动根据依赖关系决定构建顺序 -->
<module>ecommerce-common</module>
<module>ecommerce-api</module>
<module>ecommerce-dao</module>
<module>ecommerce-service</module>
<module>ecommerce-web</module>
<module>ecommerce-admin</module>
</modules>
<!-- ==================== 属性定义 ==================== -->
<!-- 统一版本管理 -->
<properties>
<!-- Java版本 -->
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Spring 版本 -->
<spring.version>5.3.20</spring.version>
<spring-boot.version>2.7.0</spring-boot.version>
<!-- 数据库相关 -->
<mybatis.version>3.5.10</mybatis.version>
<mybatis-spring.version>2.0.7</mybatis-spring.version>
<mysql-connector.version>8.0.28</mysql-connector.version>
<!-- 其他依赖 -->
<junit.version>4.13.2</junit.version>
<logback.version>1.2.11</logback.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<!-- 项目模块版本 -->
<ecommerce.version>1.0.0</ecommerce.version>
</properties>
<!-- ==================== 依赖版本管理 ==================== -->
<!-- 子模块引用时无需指定版本 -->
<dependencyManagement>
<dependencies>
<!-- ========== 内部模块 ========== -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-common</artifactId>
<version>${ecommerce.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-api</artifactId>
<version>${ecommerce.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-dao</artifactId>
<version>${ecommerce.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-service</artifactId>
<version>${ecommerce.version}</version>
</dependency>
<!-- ========== Spring ========== -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- ========== Spring BootBOM ========== -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- ========== MyBatis ========== -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- ========== 数据库 ========== -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<!-- ========== 其他 ========== -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- ==================== 插件版本管理 ==================== -->
<build>
<pluginManagement>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- 测试插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<!-- 资源插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- WAR 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
父 POM 关键元素说明
| 元素 | 说明 |
|---|---|
| packaging=pom | 父模块必须设置为 pom,不生成产物 |
| modules | 聚合子模块列表 |
| properties | 统一版本属性 |
| dependencyManagement | 统一依赖版本,子模块无需写版本 |
| pluginManagement | 统一插件配置,子模块无需写版本 |
dependencyManagement vs dependencies
Bash
区别:
dependencies:
- 实际引入依赖
- 子模块自动继承
dependencyManagement:
- 只声明版本,不实际引入
- 子模块需要显式声明才引入
- 子模块无需写版本号
示例:
父 POM(dependencyManagement):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version> ← 只声明版本
</dependency>
</dependencies>
</dependencyManagement>
子模块(dependencies):
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- 无需写版本,继承父 POM版本 -->
</dependency>
</dependencies>
优势:
- 统一版本管理
- 子模块简化配置
- 升级只需改父 POM
子模块配置
common 模块(最底层)
Bash
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!-- ==================== 继承父 POM ==================== -->
<parent>
<groupId>com.example</groupId>
<artifactId>ecommerce</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath> <!-- 父 POM路径 -->
</parent>
<!-- ==================== 子模块坐标 ==================== -->
<!-- groupId、version 继承父 POM -->
<artifactId>ecommerce-common</artifactId>
<!-- ==================== 模块信息 ==================== -->
<name>Ecommerce Common</name>
<description>公共工具类、常量、基础配置</description>
<!-- ==================== 依赖 ==================== -->
<dependencies>
<!-- commons-lang3:工具类增强 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<!-- 版本继承 dependencyManagement -->
</dependency>
<!-- 日志接口 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<!-- 版本由 Spring Boot BOM 管理 -->
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- 版本继承,scope=test -->
</dependency>
</dependencies>
</project>
api 模块(接口定义层)
Bash
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>ecommerce</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>ecommerce-api</artifactId>
<name>Ecommerce API</name>
<description>接口定义、DTO、VO</description>
<dependencies>
<!-- 依赖 common 模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-common</artifactId>
<!-- 版本继承 -->
</dependency>
<!-- JSON 序列化 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<!-- 版本由 Spring Boot BOM 管理 -->
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<!-- 版本由 Spring Boot BOM 管理 -->
</dependency>
</dependencies>
</project>
dao 模块(数据访问层)
Bash
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>ecommerce</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>ecommerce-dao</artifactId>
<name>Ecommerce DAO</name>
<description>数据访问、MyBatis Mapper</description>
<dependencies>
<!-- 内部模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-common</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-api</artifactId>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<!-- 版本继承 -->
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<!-- 版本由 Spring Boot BOM 管理 -->
</dependency>
</dependencies>
</project>
service 模块(业务逻辑层)
Bash
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>ecommerce</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>ecommerce-service</artifactId>
<name>Ecommerce Service</name>
<description>业务逻辑、事务管理</description>
<dependencies>
<!-- 内部模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-api</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-dao</artifactId>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
web 模块(Web控制层)
Bash
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>ecommerce</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>ecommerce-web</artifactId>
<packaging>war</packaging> <!-- Web 模块打包为 WAR -->
<name>Ecommerce Web</name>
<description>Web 控制器、前端交互</description>
<dependencies>
<!-- 内部模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-service</artifactId>
</dependency>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!-- 插件继承 pluginManagement -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
模块职责划分原则
分层原则
| 模块 | 职责 | 可依赖 | 不可依赖 |
|---|---|---|---|
| common | 工具类、常量、异常 | 无外部模块 | 所有模块 |
| api | 接口定义、DTO | common | dao、service |
| dao | 数据访问 | common、api | service、web |
| service | 业务逻辑 | api、dao | web |
| web | Web控制器 | service | dao、common(间接) |
依赖方向规则
XML
规则1:依赖单向传递
- 从上层到下层
- 不允许反向依赖
- 不允许跨层依赖(web 不能直接依赖 dao)
规则2:common 模块零依赖
- 最底层模块
- 只包含纯工具类
- 不依赖其他业务模块
规则3:api 模块只定义接口
- 定义 DTO、VO、接口
- 不包含实现
- 被多个模块共享
规则4:接口与实现分离
- api 定义接口
- service 实现接口
- web 通过 api 调用 service
常见分层模式
text
模式1:经典三层架构
web(控制器)
↓
service(业务)
↓
dao(数据)
模式2:DDD 分层
web(应用层)
↓
application(应用服务)
↓
domain(领域模型)
↓
infrastructure(基础设施)
模式3:微服务拆分
ecommerce-user-service(用户服务)
ecommerce-order-service(订单服务)
ecommerce-product-service(商品服务)
ecommerce-payment-service(支付服务)
每个服务独立部署
多模块构建
构建全部模块
text
# 在父项目目录执行
mvn clean install
执行顺序(Maven 自动根据依赖决定):
1. ecommerce-common(无依赖,先构建)
2. ecommerce-api(依赖 common)
3. ecommerce-dao(依赖 common、api)
4. ecommerce-service(依赖 api、dao)
5. ecommerce-web(依赖 service)
6. ecommerce-admin(依赖 service)
输出:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] ecommerce
[INFO] ecommerce-common
[INFO] ecommerce-api
[INFO] ecommerce-dao
[INFO] ecommerce-service
[INFO] ecommerce-web
[INFO] ecommerce-admin
[INFO] ------------------------------------------------------------------------
[INFO] Building ecommerce 1.0.0
[INFO] Building ecommerce-common 1.0.0
...
[INFO] BUILD SUCCESS
构建指定模块
text
# 只构建 web 模块
mvn clean install -pl ecommerce-web
# -pl(--projects)指定模块
构建指定模块及其依赖
text
# 构建 web 模块及其依赖的模块
mvn clean install -pl ecommerce-web -am
# -am(--also-make)同时构建依赖模块
执行顺序:
1. ecommerce-common
2. ecommerce-api
3. ecommerce-dao
4. ecommerce-service
5. ecommerce-web
构建指定模块及其下游
text
# 构建 dao 模块及依赖它的模块
mvn clean install -pl ecommerce-dao -amd
# -amd(--also-make-dependents)同时构建下游模块
执行顺序:
1. ecommerce-dao
2. ecommerce-service
3. ecommerce-web
4. ecommerce-admin
排除某些模块
text
# 构建所有模块,排除 admin
mvn clean install -pl '!ecommerce-admin'
# 注意引号,Windows需要转义
mvn clean install -pl "!ecommerce-admin"
查看构建顺序
text
# 查看反应堆构建顺序
mvn clean install -X | grep "Build Order"
多模块项目最佳实践
实践1:统一版本号
text
<!-- 父 POM 定义版本属性 -->
<properties>
<ecommerce.version>1.0.0</ecommerce.version>
</properties>
<!-- 所有模块使用同一版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-common</artifactId>
<version>${ecommerce.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
实践2:模块命名规范
text
命名规范:
- 项目名-模块名
- 例:ecommerce-common、ecommerce-service
好处:
- 一眼看出属于哪个项目
- 一眼看出模块职责
实践3:合理拆分模块
text
何时拆分模块:
拆分条件:
- 代码量大(超过100个类)
- 职责清晰可分离
- 可独立部署
- 不同团队维护
不建议拆分:
- 小项目(几十个类)
- 模块职责不清
- 强耦合无法分离
实践4:避免循环依赖
text
循环依赖示例(错误):
A → B → C → A ← 循环
报错:
[ERROR] The projects in the reactor contain a cyclic reference
解决:
- 重新设计模块职责
- 将共同依赖提取到新模块
常见问题
问题1:模块构建顺序错误
text
报错:
[ERROR] Failed to execute goal on project ecommerce-web:
Could not resolve dependencies for project com.example:ecommerce-web
原因:
- 依赖的模块未构建
- 模块顺序配置错误
解决:
1. 在父目录执行 mvn clean install
2. 或使用 -am 构建依赖模块
mvn clean install -pl ecommerce-web -am
问题2:版本不一致
text
问题:
- web依赖 service:1.0.0
- service依赖 dao:1.0.1
- 版本不一致
解决:
使用 dependencyManagement 统一版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>ecommerce-dao</artifactId>
<version>${ecommerce.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
问题3:父 POM找不到
text
报错:
[ERROR] Non-resolvable parent POM
原因:
- relativePath 配置错误
- 父 POM 未 install
解决:
1. 检查 relativePath
2. 先构建父 POM
mvn clean install -N # -N 只构建父 POM
要点总结
- 多模块拆分:大型项目拆分为独立模块,职责清晰
- 父 POM 两个角色:聚合+ 继承
- packaging=pom:父模块必须设置为 pom
- modules定义子模块:聚合所有子模块
- dependencyManagement:统一依赖版本,子模块无需写版本
- pluginManagement:统一插件配置,子模块无需写版本
- 依赖单向传递:上层依赖下层,不允许反向依赖
- 构建命令:-pl 指定模块,-am 构建依赖,-amd 构建下游
- 构建顺序:Maven 自动根据依赖关系决定
- 统一版本号:使用 properties 统一所有模块版本
📝 发现内容有误?点击此处直接编辑