增量编译与缓存策略
增量编译仅编译变更文件,缓存策略复用构建产物。
增量编译原理
检测机制
XML
1. 比较源码文件修改时间
2. 对比 class 文件时间戳
3. 仅编译有变化的文件
默认行为
Maven 默认启用增量编译。
增量编译配置
启用增量编译
Bash
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<useIncrementalCompilation>true</useIncrementalCompilation>
</configuration>
</plugin>
强制全量编译
Bash
mvn clean compile
clean 删除 target,触发全量编译。
增量编译限制
不触发重新编译
| 变化 | 是否触发 |
|---|---|
| 方法内部修改 | ✓ |
| 添加新类 | ✓ |
| 删除类 | ✓ |
| 修改依赖版本 | ✗(需 clean) |
| 修改编译参数 | ✗(需 clean) |
需要全量编译场景
XML
# 修改依赖版本后
mvn clean compile
# 修改 Java 版本后
mvn clean compile
IDEA 增量编译
IDEA 自动增量
IDEA 自动检测变更并增量编译。
Build 项目
XML
Build → Build Project (Ctrl+F9)
仅编译变更文件
Rebuild 项目
XML
Build → Rebuild Project
全量重新编译
Maven Build Cache Extension
配置
Bash
<build>
<extensions>
<extension>
<groupId>org.apache.maven.extensions</groupId>
<artifactId>maven-build-cache-extension</artifactId>
<version>1.0</version>
</extension>
</extensions>
</build>
缓存配置
Bash
<cache>
<enabled>true</enabled>
<cacheDir>${user.home}/.m2/build-cache</cacheDir>
</cache>
缓存效果
| 缓存 | 效果 |
|---|---|
| 编译产物 | 跳过未变更模块编译 |
| 测试结果 | 跳过已通过的测试 |
| 资源处理 | 跳过未变更资源 |
远程缓存
共享缓存
Bash
<cache>
<remoteCache>
<url>https://cache.company.com/maven</url>
</remoteCache>
</cache>
团队共享效果
- 首次构建下载缓存
- 后续构建直接复用
- 大幅减少构建时间
缓存失效条件
| 条件 | 缓存失效 |
|---|---|
| 源码修改 | ✓ |
| pom.xml 修改 | ✓ |
| 依赖版本变化 | ✓ |
| 编译参数变化 | ✓ |
| 时间戳变化 | ✗ |
缓存清理
清理本地缓存
Bash
rm -rf ~/.m2/build-cache
强制重建
Bash
mvn clean install -Dcache.enabled=false
增量编译效果对比
性能对比
| 编译方式 | 时间 |
|---|---|
| 全量编译 | 10分钟 |
| 增量编译(少量修改) | 30秒 |
| 增量编译(多模块少量修改) | 2分钟 |
效果分析
text
全量:编译全部源码
增量:仅编译变更源码
差异:增量可节省80%-95%时间
多模块增量
模块级增量
text
变更仅影响:
1. 变更模块本身
2. 依赖变更模块的下游模块
示例
text
变更 api 模块
需重新编译:
- api(变更)
- service(依赖 api)
- web(依赖 service)
跳过:
- common(未变更且不依赖 api)
构建命令优化
日常开发
text
# 增量编译
mvn compile
# 增量测试
mvn test
发布构建
text
# 全量构建
mvn clean install
快速验证
text
# 仅编译变更模块
mvn compile -pl :service
最佳实践
| 场景 | 推荐命令 |
|---|---|
| 日常开发 | mvn compile(增量) |
| 添加依赖 | mvn clean compile |
| 版本升级 | mvn clean compile |
| CI/CD | mvn clean install(全量) |
| 快速调试 | mvn compile -pl 模块 |
要点总结
- 增量编译默认启用,仅编译变更文件
- clean 强制全量编译
- 依赖/参数变化需全量编译
- Maven Build Cache Extension 提供模块级缓存
- 远程缓存团队共享构建产物
- 增量编译可节省80%-95%时间
- 发布构建建议全量编译确保完整
📝 发现内容有误?点击此处直接编辑