Maven 高级:分模块设计与开发
一、分模块开发的核心概念
分模块开发是将一个大型项目拆分成多个相互关联的子模块(Module),每个模块负责特定功能或层次,通过 Maven 实现模块化管理和依赖控制。
分模块优势:
- 解耦与复用:模块职责单一,可独立开发测试
- 并行开发:不同团队可同时开发不同模块
- 构建优化:只构建变更模块,提升效率
- 版本管理:模块可独立版本控制
- 依赖管理:清晰定义模块间依赖关系
二、分模块项目结构设计
典型分层架构示例:
my-project-parent/ ➤ 父工程(聚合工程)
├── pom.xml ➤ 父POM
├── my-project-common/ ➤ 通用模块
│ ├── src/
│ └── pom.xml
├── my-project-dao/ ➤ 数据访问层
│ ├── src/
│ └── pom.xml
├── my-project-service/ ➤ 业务逻辑层
│ ├── src/
│ └── pom.xml
└── my-project-web/ ➤ Web表现层
├── src/
└── pom.xml
三、实现分模块开发
1. 创建父工程(聚合工程)
父工程 pom.xml
配置:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-project-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <!-- 关键:打包类型为pom -->
<!-- 模块声明 -->
<modules>
<module>my-project-common</module>
<module>my-project-dao</module>
<module>my-project-service</module>
<module>my-project-web</module>
</modules>
<!-- 统一依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 其他公共依赖 -->
</dependencies>
</dependencyManagement>
<!-- 公共插件配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 创建子模块
通用模块(my-project-common)
<!-- pom.xml -->
<project>
<parent>
<groupId>com.example</groupId>
<artifactId>my-project-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>my-project-common</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 通用工具依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
</project>
数据访问层(my-project-dao)
<!-- pom.xml -->
<project>
<parent>...</parent>
<artifactId>my-project-dao</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-project-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 数据库相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
</project>
Web模块(my-project-web)
<!-- pom.xml -->
<project>
<parent>...</parent>
<artifactId>my-project-web</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-project-service</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Web相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
四、依赖传递与作用域
依赖范围(Scope)使用场景:
Scope | 说明 | 典型使用场景 |
---|---|---|
compile | 默认范围,所有阶段有效 | 项目核心依赖(如Spring Core) |
provided | 运行时由容器提供 | Servlet API, JDBC驱动 |
runtime | 运行时需要,编译时不需要 | JDBC实现库 |
test | 仅测试阶段有效 | JUnit, Mockito |
system | 系统路径依赖(慎用) | 本地特殊jar包 |
依赖传递规则:
A -> B(compile) -> C(compile) => A包含C
A -> B(compile) -> C(provided) => A不包含C
A -> B(test) -> C(compile) => A不包含C
五、多环境配置管理
1. 资源过滤配置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
2. 多环境配置文件
src/main/resources/
├── application-dev.properties
├── application-test.properties
└── application-prod.properties
3. Profile配置
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
4. 激活Profile
mvn clean package -P prod
六、构建优化技巧
1. 跳过测试
mvn install -DskipTests
2. 并行构建
mvn -T 4 clean install # 使用4线程
3. 增量构建
mvn install -pl my-project-service -am
-pl
: 指定构建的模块-am
: 同时构建依赖的模块
4. 构建缓存(Maven 3.6+)
<settings>
<localRepository>/path/to/repo</localRepository>
</settings>
七、常见问题解决方案
1. 循环依赖问题
问题:模块A依赖B,同时B依赖A
解决方案:
- 重构代码,提取公共部分到新模块
- 使用接口解耦
- 重新设计模块依赖关系
2. 依赖冲突
排查命令:
mvn dependency:tree -Dverbose
解决方式:
<dependency>
<groupId>conflict.group</groupId>
<artifactId>conflict-artifact</artifactId>
<exclusions>
<exclusion>
<groupId>unwanted.group</groupId>
<artifactId>unwanted-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
3. 多模块版本管理
推荐方案:
<properties>
<common.version>1.2.0</common.version>
</properties>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-project-common</artifactId>
<version>${common.version}</version>
</dependency>
八、最佳实践总结
模块划分原则:
- 按功能或层级拆分(controller/service/dao)
- 高内聚、低耦合
- 通用模块独立
依赖管理:
- 父POM统一管理版本
- 最小化依赖范围
- 定期运行
dependency:analyze
构建优化:
- 使用增量构建参数(-pl -am)
- 配置构建缓存
- 合理使用Profile
持续集成:
- 模块独立测试
- 并行构建加速
- 构建产物统一管理
版本策略:
- 语义化版本控制(SemVer)
- SNAPSHOT用于开发
- RELEASE用于生产
分模块设计是大型项目开发的基石,合理使用Maven的模块化能力,能够显著提升项目的可维护性、构建效率和团队协作体验。