本文最后更新于116 天前,其中的信息可能已经过时,如有错误请发送邮件到aichantech@qq.com
背景介绍
我使用Spring官方的Spring Initalizr构建SpringBoot项目,SpringBoot版本是3.4.1。
Bug介绍
在Spring Initalizr中引入Lombok后,我使用Lombok的@Data注解简化JWTConfig类的Get/Set方法编写,但是在项目启动时显示:

即找不到JWTConfig中的getUserTokenName()方法(找不到get方法)。
问题分析
我首先上网查询相关资料,发现可能是由于Idea中没有安装Lombok插件导致的。

但是在检查Idea插件后,发现已经安装。
之后发现有文章提到可能是注解开启设置没配置。但是在项目启动时,Idea会在下方进行提示:

这里我已经将注解开启设置打开。
以及有文章提到是Lombok版本有问题,但是我无论是使用默认版本,还是更新到最新版本,仍然无法使Lombok生效。
Bug修复
最后我排查到了pom.xml中两个奇怪的配置,需要说明的是这两个配置是由Spring Initalizr生成的。
<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>
这里的<annotationProcessorPaths>和<exclude>配置与Lombok有关联,当我尝试将这两个配置删去后:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Lombok生效了!
<annotationProcessorPaths>和<exclude>这两个配置的作用是:
- <annotationProcessorPaths>:用于指定编译器在编译过程中需要使用的注解处理器的路径。在其中配置Lombok后,可以告诉Maven在编译时需要处理Lombok的注解。
- <exclude>:用于指定在构建过程中需要排除的依赖。在其中配置Lombok后,会在Maven构建项目时排除Lombok依赖,不会将其包含在最终的JAR或WAR文件中。通常是为了解决依赖冲突。
看配置的描述,这两个配置主要是为了让Lombok生效,但为什么反而导致Lombok失效了呢?
使用这两个配置可能出现的问题:
- 使用<annotationProcessorPaths>显示指定注解处理器后,在IDE或构建环境中可能会干扰Lombok的正常工作,如果去掉该配置则可以让Maven自动处理注解处理器。
- <exclude>可能会导致Lombok被排除在构建过程之外,这可能会导致Lombok失效。
在经过我不断复现的过程中,发现这两个配置导致Lombok失效是偶发的,所以读者遇到Lombok失效,在问题分析步骤中的解决方法都没用时,可以尝试删去这两个配置或加上这两个配置。
多亏你了,我去弄了两天没弄好。我真的服了ヾ(≧∇≦*)ゝ
今天也碰到了这个问题,我这边找到的解决办法是注释掉第一个插件,然后把前面lombok的optional标签注释掉就ok了,第二个组件倒是不需要进行任何更改,我是通过和之前的springboot依赖做了下对比,发现就这里不太一样
╮(╯▽╰)╭