Lombok失效问题
本文最后更新于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>这两个配置的作用是:

  1. <annotationProcessorPaths>:用于指定编译器在编译过程中需要使用的注解处理器的路径。在其中配置Lombok后,可以告诉Maven在编译时需要处理Lombok的注解。
  2. <exclude>:用于指定在构建过程中需要排除的依赖。在其中配置Lombok后,会在Maven构建项目时排除Lombok依赖,不会将其包含在最终的JAR或WAR文件中。通常是为了解决依赖冲突。

看配置的描述,这两个配置主要是为了让Lombok生效,但为什么反而导致Lombok失效了呢?

使用这两个配置可能出现的问题:

  1. 使用<annotationProcessorPaths>显示指定注解处理器后,在IDE或构建环境中可能会干扰Lombok的正常工作,如果去掉该配置则可以让Maven自动处理注解处理器。
  2. <exclude>可能会导致Lombok被排除在构建过程之外,这可能会导致Lombok失效。

在经过我不断复现的过程中,发现这两个配置导致Lombok失效是偶发的,所以读者遇到Lombok失效,在问题分析步骤中的解决方法都没用时,可以尝试删去这两个配置或加上这两个配置。

评论

  1. mouse
    Windows Chrome
    3 月前
    2025-1-19 11:51:44

    多亏你了,我去弄了两天没弄好。我真的服了ヾ(≧∇≦*)ゝ

  2. Windows Chrome
    3 月前
    2025-1-20 20:04:14

    今天也碰到了这个问题,我这边找到的解决办法是注释掉第一个插件,然后把前面lombok的optional标签注释掉就ok了,第二个组件倒是不需要进行任何更改,我是通过和之前的springboot依赖做了下对比,发现就这里不太一样
    ╮(╯▽╰)╭

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇