模块间依赖关系管理
多模块项目中模块间依赖需要合理配置,避免循环依赖和版本冲突。
模块间依赖声明
依赖内部模块
XML
<!-- service 模块依赖 api 模块 -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version> <!-- 版本同步 -->
</dependency>
</dependencies>
版本同步
XML
<properties>
<project.version>1.0.0</project.version>
</properties>
<!-- 所有模块使用同一版本 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version>
</dependency>
依赖声明顺序
建议顺序
XML
<dependencies>
<!-- 1. 内部模块依赖 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
</dependency>
<!-- 2. 框架依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<!-- 3. 第三方库依赖 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<!-- 4. 测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
循环依赖检测
循环依赖表现
XML
A → B → C → A
Maven 报错
XML
[ERROR] The projects in the reactor contain a cyclic reference
解决方案
| 方案 | 说明 |
|---|---|
| 提取公共 | A、C 共同依赖提取到新模块 |
| 接口分离 | 使用接口模块解耦 |
| 事件机制 | 使用事件替代直接调用 |
提取公共模块示例
XML
原结构:
service → dao → service(循环)
解决:
service → api
dao → api
api 为公共接口模块
依赖范围控制
内部模块依赖范围
| 场景 | scope |
|---|---|
| 主模块依赖公共 | compile |
| 测试模块依赖 | test |
| API 模块可选依赖 | provided |
示例
Bash
<!-- web 模块依赖 service -->
<dependency>
<groupId>com.example</groupId>
<artifactId>service</artifactId>
<scope>compile</scope>
</dependency>
<!-- 测试模块依赖 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>test-common</artifactId>
<scope>test</scope>
</dependency>
版本对齐策略
使用 dependencyManagement
XML
<!-- 父 POM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>api</artifactId>
<!-- version 由 dependencyManagement 管理 -->
</dependency>
依赖版本冲突
内部模块版本不一致
XML
service 依赖 api:1.0.0
web 依赖 api:1.1.0
问题:版本冲突
解决:统一版本
text
<!-- 父 POM 统一版本 -->
<properties>
<project.version>1.0.0</project.version>
</properties>
模块发布顺序
发布顺序由依赖关系决定
text
反应堆构建顺序:
1. common(无依赖)
2. api(依赖 common)
3. dao(依赖 api)
4. service(依赖 api、dao)
5. web(依赖 service)
查看构建顺序
text
mvn validate
输出:
text
[INFO] Reactor Build Order:
[INFO] parent-project
[INFO] common
[INFO] api
[INFO] service
[INFO] web
依赖版本 SNAPSHOT 处理
开发期间使用 SNAPSHOT
text
<version>1.0.0-SNAPSHOT</version>
<dependency>
<groupId>com.example</groupId>
<artifactId>api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
发布时统一 RELEASE
text
<version>1.0.0</version>
要点总结
- 内部模块使用 ${project.version} 保持版本同步
- dependencyManagement 统一管理内部模块版本
- 声明顺序:内部→框架→第三方→测试
- 循环依赖通过提取公共模块解决
- 反应堆自动计算构建顺序
- 开发期用 SNAPSHOT,发布时用 RELEASE
📝 发现内容有误?点击此处直接编辑