踩坑记录 | 新版本 Spring Boot 中 Lombok 注解失效问题
今天在使用 IDEA 创建 Spring Boot 项目时,我遇到了一个问题——Lombok 注解失效,无法自动生成 getter 和 setter 方法。具体的错误信息如下:
java: 找不到符号
符号: 方法 getName()
位置: 类型为com.nx.nxapiapi.model.User的变量 user
经过一番排查,我发现原来是项目中的 Lombok 依赖出现了问题
问题原因
尽管这个问题我没有在官方文档中找到直接的描述,但通过对比 Spring Boot 不同版本的配置文件,我猜测问题的根源在于 pom.xml
中 Lombok 依赖的配置以及构建插件的使用
在我的配置中,Lombok 依赖被标记为 optional
,并且 <build>
部分的第一个插件也与 Lombok 的正常工作有关。具体来说,optional
标签会告诉 Maven 该依赖是可选的,这可能导致 Lombok 注解处理器在编译时未被正确加载。而 <build>
部分的第一个插件(maven-compiler-plugin
)用于编译 Java 代码,并且其默认行为可能没有显式启用 Lombok 注解处理器,从而使 Lombok 注解失效
解决方案
我通过以下步骤解决了这个问题:
注释掉了
pom.xml
中 Lombok 依赖的optional
标签。虽然optional
标签本身并不直接影响 Lombok 的工作,但它可能会导致构建工具忽略 Lombok 相关的处理器,因此去掉它后,Lombok 被正确加载并参与构建注释掉了
<build>
部分的第一个插件配置,特别是maven-compiler-plugin
插件的注解处理器配置部分。这一配置可能与 Lombok 的默认注解处理器路径冲突,从而导致注解处理器没有正确工作
下面是修改后的 pom.xml
文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nx</groupId>
<artifactId>NXApi-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>NXApi-api</name>
<description>NXApi-api</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!-- <optional>true</optional>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-compiler-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <annotationProcessorPaths>-->
<!-- <path>-->
<!-- <groupId>org.projectlombok</groupId>-->
<!-- <artifactId>lombok</artifactId>-->
<!-- </path>-->
<!-- </annotationProcessorPaths>-->
<!-- </configuration>-->
<!-- </plugin>-->
<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>
</plugins>
</build>
</project>
总结
这个问题本身并不复杂,只是因为在某些配置下,Lombok 注解处理器没有正确启用。通过简单修改 pom.xml
配置文件,就能恢复正常
反思
尽管目前没有官方文档明确描述这个问题,但通过对比 Spring Boot 不同版本中的 pom.xml
配置差异,我推测 optional
标签的存在和构建插件的配置可能会导致 Lombok 注解处理器未能正确加载
这个问题也提醒我,在项目中集成或更新 Lombok 这样的工具时,需要特别关注其与其他构建插件的兼容性,特别是在不同版本之间的差异
此外,升级或配置调整时,快速排查并查阅官方文档是非常必要的。即便没有明确的错误描述,通过细致的配置比较和推理,往往能找到解决问题的线索
希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。