1. 为什么不少Java老手第一次用Lombok,照样卡在环境上
先说一个特别常见的场景:项目组里某个同事在代码里加了@Data,push 上去之后其他人一拉代码,编译直接报错,满屏都是“找不到 getter/setter 方法”“找不到 builder() 方法”。第一反应是代码写错了,检查半天发现根本不是代码问题——是你本机的 Lombok 环境没搭好。
Lombok 这个东西,本质上是靠编译期注解处理来“凭空生成”代码的。它不像 Spring 那样运行时通过反射起效,而是在 javac 编译阶段直接改写抽象语法树,把@Getter、@Setter、@Builder这些注解变成真正的方法。这就带来一个核心问题:Lombok 能不能正常工作,完全取决于编译环境配得对不对。JDK 版本不对、IDE 编译器不对、依赖版本不匹配、注解处理没开,任何一个环节出问题,Lombok 就可能静默失效或者直接爆出奇怪的编译错误。
很多教程只会告诉你“在 pom.xml 里加一行依赖就行了”,但实际踩坑的人都知道,加完依赖只是第一步。我见过不少在 IDEA 里开发很顺、一到命令行mvn clean package就挂掉的情况,也见过 Eclipse 用户装完 Lombok 插件后项目依然报错的案例。如果你正准备把 Lombok 集成到项目里,或者已经加了依赖但不知道下一步该干嘛,这篇文章就把整个环境搭建过程中最容易出问题的点全部摊开来讲。
适合谁来读?刚接触 Lombok 的 Java 新人,被编译报错折磨的团队协作成员,以及准备在旧项目里引入 Lombok、但担心环境兼容性出问题的同学。下面内容我会按“原理 — 搭建 — 排错 — 避坑”的顺序写,尽量把每条报错背后的原因也讲透,而不是只给一个所谓的“标准答案”。
2. 搭环境前先搞懂JDK、编译器和Lombok版本的三角关系
Lombok 从诞生到现在,版本迭代一直跟着 JDK 走。很多人忽略了一个事实:Lombok 不是“装了就能用”的库,它必须明确支持当前使用的 JDK 版本。JDK 内部编译 API 每个大版本都有调整,Lombok 通过内部工具直接操作 javac 的 AST,JDK 一变,Lombok 的代码就可能失效。所以版本不匹配时,Lombok 要么直接罢工,要么抛出一堆让人摸不着头脑的编译异常。
2.1 版本对应关系是第一个关键点
先看一张我整理的主流版本兼容表,这张表能帮你快速判断手里的组合是否靠谱:
| Lombok 版本 | 支持的 JDK 范围 | 备注 |
|---|---|---|
| 1.18.20 及以下 | JDK 8 ~ 15 | 对 JDK 16+ 支持不完整 |
| 1.18.22 | JDK 8 ~ 16 | 开始支持 JDK 16 |
| 1.18.24 | JDK 8 ~ 17 | 修复了 JDK 17 下的一些编译问题 |
| 1.18.26 | JDK 8 ~ 18 | 对 JDK 18 支持完善 |
| 1.18.28 | JDK 8 ~ 19 | 新增了对 JDK 19 的支持 |
| 1.18.30 | JDK 8 ~ 21 | 目前最稳的版本之一 |
| 1.18.32 | JDK 8 ~ 21 | 后续维护版本 |
| 1.18.34 | JDK 8 ~ 22 | 支持 JDK 22 |
| 1.18.36 | JDK 8 ~ 23 | 较新的稳定版 |
从表里能看出一个规律:Lombok 版本和 JDK 版本是强绑定的。你项目里用了 JDK 17,却引入了 Lombok 1.18.20,那么编译时大概率会看到“You aren't using a compiler supported by lombok”的报错,后面会专门讲这条。
这里有一个更隐蔽的坑:Maven/Gradle 里配置的 JDK 和 IDE 实际使用的 JDK 可能不是同一个。比如你在命令行用 JDK 17 构建,但 IDEA 的 Project SDK 设置成了 JDK 11,两边行为就会不一致。搭建环境前,务必用命令确认一下当前命令行环境:
java -version javac -version mvn -version再看 IDEA 里的 Project Structure -> Project SDK 是否与之匹配。我见过太多“IDE 里能跑、命令行一编译就挂”的案例,基本都出在这个不一致上。
2.2 Maven 项目引入 Lombok 的正确姿势
在 Maven 项目里,常见做法是引入lombok依赖,但不少人忽略了一个关键属性:scope。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <lombok.version>1.18.30</lombok.version> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> </dependencies>为什么必须用provided?因为 Lombok 只在编译阶段生效,生成的代码已经写进.class文件了,运行时根本不需要 Lombok 这个 jar 存在。如果用默认的compilescope,Lombok 会被打包进最终产物(比如 Spring Boot 的可执行 jar),白白增大体积,在某些极端情况下还会和运行环境里的其他依赖产生冲突。
还有一个很容易踩的坑:Spring Boot 项目的父工程如果用了spring-boot-starter-parent,它本身已经帮你管理了 Lombok 的版本号,你不需要在<dependency>里再写<version>。但问题在于它锁定的 Lombok 版本可能比较保守,不一定匹配你的 JDK。比如早期 Spring Boot 2.x 管理的 Lombok 版本对 JDK 17 支持不好,你就需要在<properties>里显式覆盖:
<properties> <lombok.version>1.18.30</lombok.version> </properties>这样既保留了版本统一管理,又强制指定了兼容版本。
2.3 Gradle 项目的配置方式
Gradle 项目更简单,在build.gradle里加:
dependencies { compileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.30' } testCompileOnly 'org.projectlombok:lombok:1.18.30' testAnnotationProcessor 'org.projectlombok:lombok:1.18.30'注意 Gradle 里必须同时配compileOnly和annotationProcessor,前者让代码里能引用到 Lombok 的注解类,后者让注解处理器在编译期生效。如果只写compileOnly,Lombok 的注解能识别但不会生成任何方法,编译不报错但运行时才发现对象没有 getter/setter。这种“静默失效”比报错更坑,因为排查方向完全跑偏。
Gradle 配置还有一个 Java 版本参数要关注:
java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 }同时确认 Gradle 运行时的 JVM 版本,因为 Gradle 默认使用它自身运行的 JVM 来执行编译。你用 JDK 21 启动 Gradle,但项目 targetCompatibility 是 8,Lombok 版本又不支持 JDK 21 的话,编译同样会出问题。
3. “You aren't using a compiler supported by lombok”报错:从报错到修复的完整链路
这是 Lombok 使用中最典型、出现频率最高的一条报错,完整信息长这样:
java: You aren't using a compiler supported by lombok. Lombok will not work and your build will be broken.很多第一次遇到的人会以为这是 Lombok 版本太老,直接升级到最新版,结果发现报错还在。其实这条信息只告诉你一件事:Lombok 无法识别当前环境下正在执行编译工作的编译器。至于为什么无法识别,需要往下追。
3.1 报错背后的真正原因
Lombok 在启动时会检测当前的编译环境,包括编译器类型、JDK 版本、编译 API 的指纹等。只要有一个对不上,它就拒绝工作。常见原因有三个:
第一种:JDK 版本超出 Lombok 版本的支持范围。最典型的例子就是 JDK 17 配 Lombok 1.18.20,Lombok 1.18.20 最高只支持 JDK 15,它检测到 JDK 17 的时候直接放弃,于是抛这条错误。这种问题通常发生在升级 JDK 之后没有同步升级 Lombok 的项目里。
第二种:IDE 里使用了非 javac 的编译器。IDEA 的Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler里,默认选择的是 javac,但有些项目为了特殊需求会切换成 Eclipse 编译器(ECJ)或者 Kotlin 编译器。Lombok 虽然支持 ECJ,但对版本的挑剔程度比 javac 更高,一旦不匹配,报错就来了。命令行构建没问题、IDE 构建报错,90% 是这个原因。
第三种:编译器的 JVM 参数被修改过。极少数情况下,项目配置了--add-exports、--add-opens之类的 JVM 参数,影响了 javac 内部模块的可见性,Lombok 反射调用编译 API 时失败,也会抛出这条错误。
3.2 一次完整的排查过程
我拿一次真实排错来演示。某项目报错环境如下:IDEA 2023.2,JDK 17,pom.xml 里 Lombok 版本是 1.18.20,Maven 命令构建同样报错。
第一步,确认 JDK 版本。在终端执行java -version,显示openjdk version "17.0.8"。确认 IDE 的 Project SDK 也是 17。
第二步,确认 Lombok 版本。到pom.xml里找到lombok.version,看到 1.18.20。结合上面的兼容表,JDK 17 至少需要 Lombok 1.18.24 才能稳定支持,至此根因已经明确。
第三步,升级 Lombok 版本到 1.18.30,重新mvn clean compile。编译通过,问题解决。
整个过程不超过十分钟,但如果不了解版本对应关系,你可能先查代码、再清缓存、再重启 IDE,折腾半天发现毫无进展。版本匹配是排查这类问题的第一原则。
3.3 特殊场景:IDEA 能跑但 Maven 编译失败
还有一类诡异的情况:同样的版本,IDEA 里右键Build Project一切正常,mvn clean compile就报错。大多数情况下是 IDEA 内置编译器走的是自己的 javac 接口,和 Maven 调用的独立 javac 不是一回事。IDEA 内置了 Lombok 插件的支持,即使你的 Lombok 版本落后但插件本身有一定兼容兜底,IDE 内构建仍然能过;命令行则是纯 Java 环境,没有任何 IDE 魔法,Lombok 版本不支持就真的不支持。
遇到这种场景,别怀疑 IDE 的问题,直接用命令行编一次,报错信息反而更干净,然后对齐 Lombok 版本。
4. “lombok.javac.handlers.HandleData failed”这类编译异常,问题往往不止一个
热搜词里还有一条非常经典的报错:
java: lombok.annotation handler class lombok.javac.handlers.HandleData failed这条报错和前面那条“compiler not supported”性质完全不同。它属于Lombok 在正常工作过程中遇到了内部异常,说明注解处理器已经启动、环境也能跑,但在处理某个注解(比如@Data)时挂掉了。原因通常是下面几种情况里的某一种。
4.1 最常见原因:版本不匹配被误判为“环境正常”
有一种组合很有意思:JDK 17 配 Lombok 1.18.22,编译时不报“compiler not supported”,因为 1.18.22 声称支持 JDK 16,对 JDK 17 的检测逻辑还不完整,Lombok 尝试执行但对新版本 JDK 内部 API 的调用方式已经变了,于是快速失败,抛出HandleData failed。
这种报错比前面那种更隐蔽,因为表面上环境是兼容的(IDE 不报版本错),实际上 Lombok 已经力不从心了。解决办法同样是升级 Lombok 到支持当前 JDK 的稳定版。
4.2 隐藏的依赖版本冲突
接下来要说一个很多人想不到的点:classpath 上有多个版本的 Lombok。常见场景是这样的:项目 A 依赖了项目 B,项目 B 内部又依赖了旧版 Lombok,而项目 A 自己引了新版。Maven 的依赖仲裁机制会选一个最近的版本,但如果你用 IDE 构建时开启了Add dependencies to classpath之类的选项,某些传递依赖可能也被编译器类路径带上,导致 javac 同时看到了两个 Lombok 版本。
验证方法很简单,在项目根目录执行:
mvn dependency:tree | grep lombok如果输出里出现多个不同版本的org.projectlombok:lombok,就说明有冲突。解决办法是在<dependencyManagement>里统一声明一个版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </dependency> </dependencies> </dependencyManagement>然后所有子模块的 Lombok 依赖都不写版本号,强制统一为管理里的版本。
4.3 编译期注解处理和热部署工具的冲突
另一个容易忽略的原因:开启了 IDE 的 compile on save(自动编译),同时又在跑热部署工具,比如 JRebel、DevTools。Lombok 在编译时修改了 AST,而热部署工具会监听 class 文件变化并重新加载,两者同时操作同一个构建过程可能发生竞争,导致HandleData failed。
这种情况下常见表现是:第一次编译成功,代码改动后再编译就报错,重启 IDE 又好了,过一会儿又坏。遇到这种“抽风式”报错,优先关闭自动编译,改成手动Ctrl+F9,再配合热部署工具重试。如果关掉自动编译后问题消失,说明不是 Lombok 本身的问题,而是编译机制之间互相干扰。
4.4 排查链路的标准化流程
把这几种原因串起来,每次遇到HandleData failed我都建议按以下顺序排查:
- 记录完整的报错堆栈,注意看异常抛在哪个类的哪个方法,是
HandleData还是HandleBuilder,有时候能直接看出是哪个注解出了问题。 - 检查当前 JDK 版本与 Lombok 版本是否在兼容表内,不在就升级 Lombok。
- 执行
mvn dependency:tree确认没有多个 Lombok 版本共存。 - 确认 IDE 的 Module SDK 和 Project SDK 一致。
- 关闭 IDE 的自动编译,清掉 target/ 目录,
mvn clean compile用命令行重新构建。 - 如果命令行构建正常但 IDE 异常,检查 IDE 的 Java Compiler 设置是否用了非 javac 编译器。
这条路走下来,能解决绝大多数HandleData failed问题。如果最后一步还不行,那就用最朴素的办法:删掉~/.m2/repository/org/projectlombok目录,强制 Maven 重新下载干净依赖,再把 IDEA 的缓存清一遍(File -> Invalidate Caches)。这一招治好了我不少“疑难杂症”。
5. IDEA和Eclipse的Lombok集成:两边踩坑方式完全不同
同一个 Lombok,在两个主流 IDE 里的集成方式可以说是天壤之别。IDEA 从 2020.3 版本开始内置了 Lombok 插件支持,Eclipse 则必须手动安装,这个差异导致很多团队里“IDEA 用户一脸轻松、Eclipse 用户满头问号”的局面。
5.1 IDEA:内置插件但还有两个开关
新版 IDEA 不需要再额外安装 Lombok 插件了,但从旧版 IDEA 升级上来的项目还是可能遇到问题。首先是确认插件存在:Settings -> Plugins,搜索 Lombok,如果看到Installed状态就没问题。如果显示未安装,装完后必须重启 IDE。
其次也是最容易漏的:开启 Annotation Processing。位置在:
Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors勾选Enable annotation processing。这个开关控制的是编译时要不要运行注解处理器,Lombok 的原理决定了它必须依赖这个机制。很多人在 IDEA 里新装插件后依然报错,就是忘了这一步。
再补充一个细节:如果项目用的 JDK 版本比较高,比如 JDK 21,部分 IDEA 版本里插件支持可能滞后。表现为 IDEA 内置 Build 正常但代码高亮时报红,或者提示找不到符号。遇到这种问题,先在Settings -> Build Tools -> Maven -> Runner -> JRE里确认 Maven 运行时的 JRE 版本,再看 IDE 的 LOMBOK 插件版本。IDEA 插件更新一般是跟着 IDE 版本走的,所以尽量保持 IDE 是较新的版本。
5.2 命令行构建没问题、IDEA 构建报错
有一种非常常见的错位场景:mvn clean package构建成功,但 IDEA 里点运行或者 Build 就报错。排查方式前面提过,先看 IDEA 用的编译器是不是 javac。
IDEA 里有一个鲜为人知的坑:如果你的项目里同时有 Java 模块和 Kotlin 模块,Kotlin 编译器会介入 Java 代码的编译流程,此时 Lombok 的注解处理器不一定能被正确触发。就算你的代码全是 Java,只要模块配置里 Kotlin 插件被激活了,也可能出现类似问题。解决方案是在Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler里,把Use compiler明确改成Javac,并且把Preferred build process设为In-process build或设置对应的 VM 选项。
5.3 Eclipse:手动安装是唯一途径
Eclipse 因为编译器是 ECJ,与 Lombok 的配合需要显式注入。Eclipse 下的标准安装方式如下:
- 下载 Lombok jar 包,官方地址
https://projectlombok.org/download。 - 打开命令行执行
java -jar lombok.jar,会弹出安装引导界面。 - 在引导界面里选择你的 Eclipse 安装目录,点击 Install。
- 安装完成后重启 Eclipse,检查
Eclipse -> About Eclipse里是否出现了 Lombok 标识。
如果你用的是 Eclipse 2023 之后的版本,有些版本已经从 Eclipse Marketplace 支持 Lombok 安装了,但更稳的还是手动java -jar方式。这里有一个非常常见的坑:Lombok 安装时会修改eclipse.ini文件,往里面加一行-javaagent:lombok.jar参数。如果你的 Eclipse 是从多个目录启动的(比如工作区目录和安装目录不一致),或者你后来移动了 Eclipse 安装位置,这行参数就会失效,Lombok 静默不工作。排查时先看eclipse.ini里有没有残留的旧路径。
还有一个 Eclipse 特有的问题:即使 Lombok 安装成功,代码里也可能出现“getter/setter 找不到”的红线报错。这通常是因为 Eclipse 的注解处理没有开启,需要到Window -> Preferences -> Maven -> Annotation Processing里勾选Enable annotation processing,同时确保 Project Properties -> Java Compiler -> Annotation Processing 也处于开启状态。Eclipse 的注解处理设置是分 Project 级和全局级的,两边都得检查。
5.4 两边的常见对比
| 对比维度 | IDEA | Eclipse |
|---|---|---|
| 插件安装 | 新版内置,旧版需手动装 | 必须下载 lombok.jar 手动安装 |
| 注解处理开关 | Settings -> Compiler -> Annotation Processors | Window -> Preferences -> Maven -> Annotation Processing |
| 编译器 | 默认 javac,偶尔被 Kotlin 插件影响 | 默认 ECJ,支持度依赖 Lombok 对 ECJ 的适配 |
| 高亮报错 | 需要配合插件,否则代码不识别 | 安装好了才识别,否则红线一片 |
| 移动 IDE 后的坑 | 插件仍可用 | lombok.jar 的 agent 路径可能失效 |
6. 注解处理器改写AST的代价:Lombok隐藏坑与规避方案
Lombok 能流行起来,核心卖点就是“减少样板代码”。但你享受了这种便利的同时,必须理解它背后的代价:所有生成的方法都是在编译阶段写入.class文件的,这意味着源码里看不到它们,一切依赖“源码可见性”的工具都会受到不同程度的影响。
6.1 @Data 和继承放一起时,Builder 不会带上父类字段
这是我在实际项目中遇到最多的问题。看下面的代码:
@Data @Builder public class Parent { private String name; } @Data @Builder public class Child extends Parent { private Integer age; }很多人的预期是Child.builder().name("test").age(18).build()能正常工作。但实际上这样写编译直接报错,因为Child生成的 builder 只包含age字段,name是父类的字段,Lombok 不会把父类的字段也放进子类的 builder 里。
解决方案有两种:
// 方案一:在子类里手动加一个包含父类字段的构造函数 @Builder public Child(String name, Integer age) { super(name); this.age = age; }// 方案二:用 @SuperBuilder(Lombok 1.18.2 之后支持) @Data @SuperBuilder public class Parent { private String name; } @Data @SuperBuilder public class Child extends Parent { private Integer age; }@SuperBuilder是专门为继承场景设计的,它能在子类 builder 中暴露父类字段。但这个注解也有坑:它要求父类也得标注@SuperBuilder,并且生成的代码结构和普通@Builder不一样,如果你在一个继承链中混用@Builder和@SuperBuilder,编译时可能生成两个不兼容的 builder 类,反而更乱。
6.2 @Builder 会吞掉字段初始化值
再看一个让人迷惑的行为:
@Builder public class User { private int status = 1; private String role = "user"; }如果你直接new User(),status是 1,role是 "user"。但如果你用User.builder().build(),这两个字段的值是 0 和 null,因为 builder 模式生成的无参构造函数不会执行字段初始化逻辑。Lombok 的官方解决办法是加@Builder.Default:
@Builder public class User { @Builder.Default private int status = 1; @Builder.Default private String role = "user"; }这个坑非常隐蔽,尤其是从new切换到 builder 模式的场景,代码逻辑不变但数据行为完全变了,排查起来相当痛苦。我的建议是:涉及到字段默认值且希望默认值生效的类,要么统一用 @Builder.Default,要么干脆别用 @Builder。
6.3 源码级工具看不见生成的方法
这个问题讨论得很热但对实际影响要看你的使用场景。比如你在 IDE 里用Ctrl+点击跳转方法时,会跳到一个叫User.java的带 Lombok 生成的代码片段视图里,IDEA 通过反编译模拟了这个效果,但如果你用其他编辑器、代码评审工具、或者静态分析工具,它们看到的只是源码,源码里没有这些方法。静态代码扫描工具(SonarQube 早期版本)可能因此认为你的类有很多未使用字段,或者直接判定方法缺失。
如果你的团队有严格的代码评审流程、CICD 里跑了覆盖率统计,建议提前在流水线里加入 Lombok 的 delombok 步骤,把生成的代码落成真实源码再跑分析工具。Maven 里可以这样配置:
<plugin> <groupId>org.projectlombok</groupId> <artifactId>lombok-maven-plugin</artifactId> <version>1.18.20.0</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>delombok</goal> </goals> <configuration> <addOutputDirectory>false</addOutputDirectory> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <outputDirectory>${project.build.directory}/delombok</outputDirectory> </configuration> </execution> </executions> </plugin>配置之后延迟生成的源码会输出到target/delombok,分析和覆盖率统计就针对这个目录跑。虽然增加了构建步骤,但能避免工具链上很多莫名的误报。
6.4 @SneakyThrows 最好克制使用
@SneakyThrows允许你在不写 try-catch 的情况下抛出受检异常,写起来确实很爽,但它在字节码层面做的是“不声明但实际抛出”,导致调用方无法从方法的 throws 声明里感知到可能出现的异常。如果你的项目对异常处理有明确约定,或者任务需要交付给其他团队维护,建议在接口边界、对外服务方法上不要用@SneakyThrows,否则排障的时候会少了一条重要线索。它不是 Lombok 环境搭建的问题,但属于引入 Lombok 后项目中容易出现的设计隐患,顺便提一嘴。
6.5 Delombok 作为依赖冲突时的兜底方案
环境问题怎么排查都搞不定的时候,还有一个“绕过问题”的思路:直接用 delombok 生成真实的 Java 源码,替换掉 Lombok 注解。操作方式简单:把代码里@Data等注解删掉,替换成生成的 getter/setter/constructor,然后移除 Lombok 依赖。虽然失去了 Lombok 的便利性,但能绕开所有编译期问题。
这个方案我一般不推荐作为长期策略,因为维护成本高且丢失了 Lombok 的表达力。但当你遇到老旧项目、特殊 JDK、不可升级的 IDE 等多重限制叠加,实在无法让 Lombok 正常工作时,它是一个能保证项目继续推进的实际解法。先让项目活下去,再考虑要不要用更现代的方式重构。
7. 我在大量Lombok环境问题中总结出的实操习惯
最后分享几个我这几年处理 Lombok 环境问题积累下来的习惯,不一定都写在官方文档里,但确实能帮你少走很多弯路。
第一,新项目把 Lombok 版本写死在 properties 或 dependencyManagement 里。不要省略版本号,不要依赖 Spring Boot 父工程的默认管理。显式声明版本可以让你在升级 JDK 时第一时间发现版本不匹配,而不是被一个隐式的旧版本困住。
第二,一切以命令行构建为准。IDEA 里的构建结果会受插件、内置编译器、注解处理开关影响,它的成功不代表项目真正能构建通过。每次环境变动之后,先跑一遍mvn clean compile或者gradle clean build,确认命令行通过后再回归 IDE。这条规范能让你快速定位问题出在 IDE 配置还是项目依赖。
第三,团队内部约定统一的 IDE 配置。Lombok 在 IDEA 和 Eclipse 下的行为差异很大,如果团队里两拨人都有,最好在 README 或者 wiki 里写明“IDEA 需要开启 Annotation Processing,Eclipse 需要额外安装 lombok.jar”,避免每个新人都重复踩一遍同样的坑。我在带项目时甚至会把eclipse.ini和 IDEA 的配置检查项写进入职环境准备清单里,效果很好。
第四,遇到奇怪的编译问题先清缓存再下结论。Maven 本地仓库里损坏的 jar、IDEA 的索引缓存、Eclipse 的编译中间产物,都会产生看似无解的报错。mvn clean只能清 target,清不了~/.m2里的脏依赖。当报错内容与代码本身完全没关系时,删掉~/.m2/repository/org/projectlombok强制重新下载,或者File -> Invalidate Caches / Restart,大概率能解决一半的“玄学问题”。
Lombok 的环境搭建说难不难,说简单也不简单,核心就是版本匹配和 IDE 配置这两件事。把这两件事理顺,剩下的就是平常使用而已。希望这篇文章能帮你省下几个小时的排查时间,把精力留给真正有价值的业务代码。