使用Lombok @Builder时IDEA正常但Maven编译找不到FooBuilder类
这个问题是Java编译阶段的执行顺序和Lombok注解处理器的执行时机不匹配导致的:
Java编译器在执行注解处理器之前,会先对所有源码的语法、类型引用做前置校验,此时Lombok的
@Builder注解还没运行生成FooBuilder静态内部类,编译器就会直接抛出找不到符号的错误。
IntelliJ IDEA内置了Lombok插件,会提前识别@Builder注解生成的类结构,因此本地运行不会报错,但是Maven的编译流程严格遵循JDK的标准编译阶段,就会触发校验失败。
还有一个常见的次要诱因:你只在maven-compiler-plugin的annotationProcessorPaths中配置了Lombok,没有在项目根依赖节点<dependencies>中引入scope为provided的Lombok依赖,导致编译期源码层面找不到Lombok相关的类定义。
你可以根据自己的项目情况选择任意一种方案解决:
方案1:补充Lombok基础依赖
在项目pom.xml的<dependencies>节点下添加Lombok依赖(版本和annotationProcessorPaths中配置的版本保持一致即可):<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency>这个依赖仅作用于编译阶段,不会被打包到最终产物中。
方案2:预先声明空的Builder内部类占位
在Foo类中手动添加一个空的静态内部类FooBuilder,Lombok的@Builder注解会自动向这个已有的类中填充属性、链式方法等内容,不会覆盖你手动声明的类,编译器在前置校验阶段就能找到这个类,避免报错:@Data @NoArgsConstructor @AllArgsConstructor @Builder public class Foo { // 新增占位内部类 public static class FooBuilder {} private String submit; private String modify; public static Foo.FooBuilder ofSubmit(String submit) { return Foo.builder() .submit(submit); } }方案3:升级maven-compiler-plugin版本
将maven-compiler-plugin的版本升级到3.10.1及以上,新版本优化了注解处理器生成类的前向引用支持,可以兼容这种未生成类的引用场景:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <!-- 其余原有配置保持不变 --> </plugin>
内容的提问来源于stack exchange,提问作者Alvaro Berrocal

