Maven 进阶
约 773 字大约 3 分钟
布欧-Lewyon
2026-05-15
项目变大后,单模块 POM 无法满足需求。本节覆盖多模块构建、Profile 环境切换、版本管理以及 Gradle 的简要对比。
多模块项目
多模块结构将一个大项目拆成多个子模块,共享父 POM 的配置。
父 POM
父模块的 pom.xml 使用 <packaging>pom</packaging>,在 <modules> 中列出子模块:
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>service</module>
<module>web</module>
</modules>目录结构:
my-project/
├── pom.xml (父 POM,packaging=pom)
├── common/
│ └── pom.xml
├── service/
│ └── pom.xml
└── web/
└── pom.xml子 POM
子模块通过 <parent> 引用父 POM,省去重复的版本声明:
<parent>
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>service</artifactId>
<!-- 继承父 POM 的 groupId 和 version -->模块间依赖
子模块之间可以互相依赖。service 依赖 common:
<!-- service/pom.xml -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>在父模块根目录执行 mvn install 会按依赖顺序自动构建所有子模块。
依赖管理集中化
使用 <dependencyManagement> 在父 POM 中统一声明版本,子模块只需引用 groupId 和 artifactId,无需写版本号:
<!-- 父 POM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.2-jre</version>
</dependency>
</dependencies>
</dependencyManagement><!-- 子模块 -->
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<!-- 版本继承自父 POM -->
</dependency>
</dependencies>Profile:环境切换
通过 <profiles> 为不同环境(开发/测试/生产)使用不同的配置:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<db.url>jdbc:h2:mem:dev</db.url>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<db.url>jdbc:mysql://prod-server:3306/app</db.url>
</properties>
</profile>
</profiles>使用 Profile:
mvn package -P prod常用命令与技巧
mvn dependency:tree # 查看依赖树(定位冲突)
mvn help:effective-pom # 查看最终合并后的 POM
mvn versions:display-dependency-updates # 检查依赖新版本
mvn clean test -DskipTests=false # 跳过测试:-DskipTests=true
mvn source:jar # 生成源码 JARGradle 概念对照
| 对比维度 | Maven | Gradle |
|---|---|---|
| 配置语言 | XML | Groovy / Kotlin DSL |
| 约定目录 | 固定 | 可配置,但默认与 Maven 兼容 |
| 增量构建 | 有限(需插件) | 内置增量缓存,大型项目更快 |
| 依赖管理 | POM + 仓库 | 相同仓库体系,但支持动态版本 |
| 多模块 | module + 继承 | settings.gradle + api/implementation |
选择建议:企业团队、项目标准化优先 → Maven;构建性能、脚本灵活性优先 → Gradle(Android 项目的官方选择)。
小结
- 多模块项目:父 POM 声明
<packaging>pom</packaging>,子模块通过<parent>继承。 <dependencyManagement>集中管理版本,子模块无需重复写版本号。- Profile 实现环境切换(
-P参数激活)。 mvn dependency:tree是排查依赖冲突的利器。- 易错:多模块构建时
mvn install与mvn package的区别——install将模块安装到本地仓库,解决模块间依赖;仅package不打入本地仓库,其他模块会找不到依赖。 - 思考任务:创建一个包含
common和app两个子模块的多模块项目,app依赖common,用mvn clean install构建。
上一节:Maven 基础
下一节:JUnit 5 基础
