jpms本身不提供增量编译,但通过exports/ requires明确依赖边界,使maven/gradle能精准判断重编范围;maven需配置useincrementalcompilation并正确设置--module-path,gradle则原生支持模块级影响传播。

Java 模块化系统(JPMS)本身不内置增量编译功能,但通过模块声明明确的依赖边界,能让 Maven 或 Gradle 等构建工具更精准地判断“哪些必须重编”,从而显著提升增量编译的效率和可靠性。
模块结构让影响分析更准确
传统类路径下,一个工具类修改可能触发几十个模块重编;而模块化后,exports 和 requires 声明划清了可见性边界:
- 只导出
com.example.api包 → 修改内部com.example.internal不会影响下游模块 - 某模块
requires my.core→ 只有my.core的导出包变更时,才需重编该模块 - 服务加载(
ServiceLoader)调用可结合uses/provides做定向影响分析(需插件支持)
Maven 中启用模块感知的增量编译
Maven 3.6.3+ 支持 JPMS,但默认不开启增量。关键配置如下:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 确保使用
maven-compiler-plugin 3.8.1+,并设置<useincrementalcompilation>true</useincrementalcompilation> -
--module-path必须指向已编译模块的输出目录(如${project.build.outputDirectory}/modules),否则退化为全量编译 - 源码时间戳 + javac 的
-implicit:none是底层驱动机制,模块路径配置错误会导致该机制失效
Gradle 提供更自然的增量支持
Gradle 将模块视为一级构建单元,原生支持跨模块影响传播:
- 每个模块对应独立的
JavaLibrary组件,输入输出定义清晰 -
module-info.java变更自动标记相关编译任务为“过期” - 例如:
auth-module更新导出接口 →api-gateway编译任务自动触发,无需手动声明依赖
真正提效的关键不在工具开关,而在模块设计
再强的增量能力也救不了糟糕的依赖结构:
- 避免把高频变动的工具类、DTO、常量塞进基础模块——它们是重编译传播的源头
- 禁止循环依赖:模块 A
requiresB,B 又间接依赖 A,会破坏增量判断逻辑 - 生成代码(如 Lombok、protobuf)与手写源码分开放置,否则构建系统无法稳定识别变更范围
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










