Gradle项目接入Lombok必须同时配置compileOnly和annotationProcessor,仅加compileOnly会导致注解处理器不启用,@Data等注解静默失效,运行时报setXXX方法找不到、IDE标红;Gradle 5.0+已废弃自动发现机制,必须显式声明二者配对。

Gradle Java项目接入Lombok,光加 compileOnly 依赖是不够的——编译期注解处理器不会自动启用,@Data 看似写了,运行时却报 setXXX 方法找不到,IDE 里也标红,这是最典型的配置遗漏现象。
Gradle 5.0+ 必须显式声明 annotationProcessor
Gradle 5.0 起废弃了从 compileClasspath 自动发现注解处理器的机制,Lombok 的 lombok.launch.AnnotationProcessorHider$AnnotationProcessor 不再被识别。只写:
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.32'
}
会导致注解完全不生效。正确写法必须配对出现:
-
compileOnly:确保 Lombok 不打进最终 jar/war,避免运行时污染 -
annotationProcessor:把 Lombok 注解处理器真正挂到编译流水线上
示例(Groovy DSL):
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'
}
若用 Kotlin DSL(build.gradle.kts),写法等价但语法稍异:
dependencies {
compileOnly("org.projectlombok:lombok:1.18.32")
annotationProcessor("org.projectlombok:lombok:1.18.32")
}
IDEA 里报红但编译通过?检查 Lombok 插件和“Enable annotation processing”
即使 Gradle 配置正确,IntelliJ IDEA 仍可能显示 cannot resolve symbol 或 getter/setter 标红——这不是 Gradle 的问题,而是 IDE 没同步注解处理结果。
- 必须安装官方
Lombok Plugin(Marketplace 搜索安装,重启 IDEA) - 进入
Settings → Build → Compiler → Annotation Processors,勾选Enable annotation processing - 确认项目 SDK 和 language level 与 Lombok 版本兼容(如 Lombok 1.18.30+ 要求 JDK 11+)
注意:插件版本需与 Lombok 库版本大致匹配(例如都用 1.18.32),否则可能出现预览正常但跳转失效的情况。
用 implementation 或 api 引入 Lombok 是错的
有人为图省事把 Lombok 写成:
implementation 'org.projectlombok:lombok'
这会导致两个实际问题:
- 打包时 Lombok 的
.jar被打进生产包,运行时 classpath 多出无用依赖,违反“编译期工具不参与运行”的原则 - 某些构建环境(如 CI 流水线)若未启用 annotation processing,反而因依赖存在而掩盖真实配置缺陷,排查更困难
compileOnly + annotationProcessor 是唯一符合 Lombok 设计意图的组合。不要试图用 testImplementation 或 runtimeOnly 替代——前者只在测试编译生效,后者根本不起作用。
发布到 Maven 私服时,Lombok 注解会消失?这其实是正常的
如果用 maven-publish 插件发布模块,发现消费者项目无法识别 @Data ——不是配置错了,而是 Lombok 的工作阶段本就在编译期。
- 源码中的
@Data不会保留在字节码或 JAR 中,它只用于触发 AST 修改 - 生成的
getXXX()、setXXX()方法已存在于 class 文件里,只要消费者项目自己也配好 Lombok(compileOnly+annotationProcessor),就能正常使用 - 不需要在
pom.xml或publishing块中额外声明 Lombok 为optional或provided,那属于 Maven 场景的惯用法,Gradle 下不适用
真正要警惕的是:如果你的模块本身是被其他项目 implementation 的,且它内部用了 @Builder 等复杂注解,务必确保该模块的构建过程完整执行了 annotation processing——否则 class 文件里缺方法,下游调用必崩。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











