前言
创建一个普通的SpringBoot项目,如果添加了lombok依赖,pom.xml会自动生成这样一段配置代码:
这样生成的意义是什么呢?
我们先来说第一个:
一、annotationProcessorPaths
<annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </path> </annotationProcessorPaths>
为什么 Lombok 要这样单独写在 maven-compiler-plugin 里,而不是只在 <dependencies> 里引入。
首先Lombok 不是像 Spring、MyBatis 那样的运行时库,它是一个✅ 编译期注解处理器(Annotation Processor)。
也就是说:
- 它在你执行
mvn compile时介入; - 扫描代码里的注解(例如
@Getter,@Builder); - 在编译阶段动态生成 getter/setter 等方法;
- 这些方法直接进入
.class文件; - 编译完成后,运行时根本不需要 Lombok。
1.1 Maven 默认不传递编译期处理器
默认情况下,Maven 的 maven-compiler-plugin:
- 只编译源代码;
- 不会自动把编译期注解处理器(像 Lombok)加进去;
- 尤其是某些 IDE 或构建环境(CI)会因此报错:
“Cannot find symbol getXXX()”
因为 Lombok 没有被 javac 加载为 annotation processor。
1.2 annotationProcessorPaths 的作用
这一段配置:
<annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </path> </annotationProcessorPaths>
就是告诉 Maven:
编译时请显式地把 Lombok 注册为注解处理器(Annotation Processor)。
这样,javac 编译源码时,Lombok 的生成逻辑会被执行。
所以 @Getter, @Builder, @Slf4j 等注解才能生效。
1.3 如果不写会怎样?
编译后 .class 里就没有生成 getter/setter方法了。
可能会报如下的错:
[ERROR] cannot find symbol
symbol: method getName()
location: variable user of type com.example.User
1.4 测试引发的新问题,不写也不会报错?
我创建了一个实体类,用来测试:
当我执行mvn clean package,发现还是可以成功编译打包,这是为什么呢?
根本原因就是maven3.6以上版本可以自动识别lombok,所以这里删掉也没事。
二、excludes
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin>
这里就很明确了,打包的时候排除lombok依赖包。因为你之前已经将注解编译为getter/setter方法了,.class字节码文件已经有了正常的getter/setter代码,所以运行时根本不需要再加载 Lombok 的 jar,而且还会增加jar包的体积。