lombok等注解处理器在jdk 17+中静默失效,源于jpms模块系统彻底移除com.sun.tools.javac.processing.javacprocessingenvironment等内部api,旧版处理器(如lombok≤1.18.20)因硬编码依赖而无法加载,javac直接跳过执行。

注解处理器(如 Lombok、MapStruct)在 OpenJDK 升级后彻底不触发,不是配置遗漏,而是编译器 API 兼容性断裂导致的静默失效。
为什么 JDK 17+ 的 javac 不再调用你的注解处理器
OpenJDK 9 起引入了模块系统(JPMS),JDK 14 开始限制反射访问内部类,JDK 17 彻底移除 com.sun.tools.javac.processing.JavacProcessingEnvironment 等非标准 API;而很多老版注解处理器(尤其是 Lombok ≤1.18.20、旧版 MapStruct)仍硬编码依赖这些内部类型。结果就是:javac 启动时发现处理器无法加载或初始化失败,直接跳过执行——不报错、不警告、不生成代码,只默默编译原始源码。
- 典型现象:Lombok 的
@Data不生成getter,@Slf4j的log变量标红,但mvn compile无任何错误输出 - 验证方式:加
-XprintProcessorInfo参数运行javac,若输出中完全不出现你期望的处理器类名,说明它根本没被注册 - 关键区别:这不是 IDE 配置问题(Eclipse/IDEA 的 annotation processing 开关只是前端开关),而是
javac底层根本没把处理器实例化
检查并升级注解处理器版本是否匹配 JDK
必须按 JDK 主版本号对齐处理器版本,不能只看“最新版”:
- Lombok:JDK 17+ 必须用
lombok-1.18.30+(1.18.30 是首个完整支持 JDK 17+ 编译器 API 的稳定版);lombok-1.18.28在 JDK 21 下会静默失败 - MapStruct:JDK 17 对应
mapstruct-1.5.5.Final或更高;1.4.2.Final在 JDK 17 上无法处理 record 类型 - AutoValue:需
auto-value-1.10.3+,旧版在 JDK 17+ 中因javax.annotation移除而崩溃 - Maven 用户注意:
maven-compiler-plugin版本也得同步升级,3.8.1不兼容 JDK 17,必须用3.11.0+
绕过内部 API 依赖的临时方案(仅限紧急修复)
当无法立即升级处理器时,可强制让 javac 加载旧版处理器,但仅限开发环境:
- 添加 JVM 参数:
-J--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED - Maven 中写法(
pom.xml):<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><configuration><compilerargs><arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg><arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg></compilerargs></configuration></plugin>
- ⚠️ 这是权宜之计:OpenJDK 21+ 默认禁用
--add-opens,且该参数在 CI 环境常被安全策略拦截
IDE 需要单独重载注解处理链
即使命令行编译正常,IDE 仍可能沿用旧缓存的处理器类路径:
- Eclipse:必须重新运行
lombok.jar安装器,并确认eclipse.ini中-javaagent指向的是**新版本**的 lombok.jar(比如lombok-1.18.30.jar) - IntelliJ IDEA:File → Settings → Build → Compiler → Annotation Processors → 勾选 “Enable annotation processing”,然后点击右下角 “Apply” 旁的
Reload project图标(不是 Restart) - VS Code + Extension Pack for Java:删除
.vscode/settings.json中残留的"java.configuration.updateBuildConfiguration": "interactive",改用"automatic"并重启 Java Language Server
最易被忽略的一点:JDK 升级后,Maven/Gradle 的本地仓库里可能缓存着旧版注解处理器的 processor.jar,它会被优先加载。遇到诡异的“升级了但没生效”,先清空 ~/.m2/repository/org/projectlombok/ 或 ~/.gradle/caches/ 中对应路径再试。











