文章

踩坑记录 | 新版本 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 注解失效

解决方案

我通过以下步骤解决了这个问题:

  1. 注释掉了 pom.xml 中 Lombok 依赖的 optional 标签。虽然 optional 标签本身并不直接影响 Lombok 的工作,但它可能会导致构建工具忽略 Lombok 相关的处理器,因此去掉它后,Lombok 被正确加载并参与构建

  2. 注释掉了 <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 这样的工具时,需要特别关注其与其他构建插件的兼容性,特别是在不同版本之间的差异

此外,升级或配置调整时,快速排查并查阅官方文档是非常必要的。即便没有明确的错误描述,通过细致的配置比较和推理,往往能找到解决问题的线索

希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。

License:  CC BY 4.0