非常棒的问题,这说明你已经进入了 Maven 多模块项目(Multi-Module Project) 的核心阶段。
这是企业级 Java 项目中最常见、最规范的结构之一,比如 Spring、MyBatis、Hutool 自身都这样组织。
🧩 一、整体概念
在多模块项目中:
- 顶层有一个 父项目(parent project)
- 下面有多个 子模块(modules)
- 每个模块都有自己的
pom.xml - 子模块通过
<parent>标签 继承父 pom
简单理解:
父 pom 负责 统一管理版本、依赖、插件
子模块只关心自己的业务逻辑和额外依赖
🏗️ 二、典型目录结构
text
my-project/ ← 根项目(父模块)
│
├── pom.xml ← 父 pom(管理统一配置)
│
├── bird-api/ ← 子模块 1
│ └── pom.xml
│
├── bird-service/ ← 子模块 2
│ └── pom.xml
│
└── bird-common/ ← 子模块 3(公共工具包)
└── pom.xml
🧱 三、父 pom.xml(根项目)
父项目一般只包含统一配置,不写 Java 代码。
xml
<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>my-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>bird-common</module>
<module>bird-service</module>
<module>bird-api</module>
</modules>
<!-- 统一的依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 通用属性 -->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
📌 注意:
packaging必须是 pommodules标签中列出所有子模块文件夹名- 不在父 pom 中放业务代码
🧩 四、子模块的 pom.xml(继承父 pom)
示例:bird-service/pom.xml
xml
<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.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>bird-service</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 从父 dependencyManagement 中继承 hutool 版本 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- 依赖本地模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>bird-common</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
🧩 五、依赖传递与版本管理
| 项目层级 | 内容 | 是否继承 |
|---|---|---|
<dependencies> |
声明依赖 | ❌ 不自动继承 |
<dependencyManagement> |
管理版本号 | ✅ 子模块继承(但需显式声明依赖) |
<properties> |
公共属性(如版本号) | ✅ 子模块继承 |
<build> |
编译配置 | ✅ 子模块继承 |
⚙️ 六、构建方式
在父项目根目录执行:
bash
mvn clean install
Maven 会:
- 先构建父模块
- 再依次构建子模块
- 自动处理依赖顺序(例如 bird-service 依赖 bird-common)
🌳 七、示意关系图
my-project (父pom)
├── bird-common ← 工具类模块
├── bird-service ← 业务逻辑层(依赖 common)
└── bird-api ← 接口层(依赖 service)
✅ 八、总结要点
| 项目角色 | 说明 |
|---|---|
| 父 pom | 统一管理版本、插件、属性 |
| 子 pom | 继承父 pom,声明自身依赖 |
<dependencyManagement> |
管理但不引入依赖 |
<modules> |
声明子模块路径 |
mvn install |
会构建所有模块,保证依赖顺序 |