IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录

概述|背景

报错解析

解决方法

IDEA配置解决

Pom配置插件解决


概述|背景

报错发生背景:在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。

本文讨论在上述背景下发生的报错原因和解决办法,如果仅为了解决BUG不论原因直接通过目录跳到【解决方法】,如果发生背景不同请找其他博文寻求解决。

Lombok"找不到符号"代码报错一般位置:

1.代码: log.info("日志内容..");   (使用了注解@Slf4j)

2.代码:class.getX(); (使用了注解@Data

报错解析

1.为什么会出现“找不到符号”的报错呢?

我们遇到这个报错时一般都会想到:“难道是这个变量没有定义?”,但是转念一想我们所引用的是Lombok给我们提供的变量。

所以,我们应该去探索Lombok内部,我们在使用log(log.info("日志内容.."))变量时,到底发生了什么。

实际上,当我们编写了代码:log.info("日志内容.."),在项目编译时遇到log变量,会发生的事情是自动帮我们补充了代码:private static final Logger log = LoggerFactory.getLogger(...); 向我们提供了log这个变量引用。

所以,如果这段“自动生成的代码”没有自动生成的话,那么log变量自然就找不到,报错"找不到符号"那也就合理解释了。

当然,代码:class.getX(); 原理也是一样的,只不过自动生成的代码不同罢了(这段代码自动生成的是getter函数)。

-.- | `.`

2.自动生成代码的时机?

当我们明白了会报“找不到符号”的原因就是该自动生成的代码没有生成后,我们就该研究一下“使用lombok时何时帮我们自动生成代码”。

我们在使用Lombok时一般都会在所在类上添加"lombok相关注解"。

例如:想使用日志log.info(),我们就该声明注解"@Slf4j",当想要自动给类中所有字段添加Getter和Setter函数时就该声明"@Data"对吧。

实际上这些注解就会成为自动生成代码位置的锚点。

当项目代码编译时遇到这些注解,“lombok注解处理器”就会识别并生成相应代码。

+.+ | *。*

 3.注解处理器-最终解释 

最终我们会把问题聚焦在"注解处理器是否正确加载"的问题上来。

因为如果lombok注解处理器没有正确加载,那么当代码编译时遇到"lombok变量"自然就没有办法识别。

所以,我们下面我们的解决方案就是“让注解处理器正确工作”。

解决方法

IDEA配置解决

添加VM选项-D jps.track.ap.dependencies=false

这是目前网络上热门的解决方法,但这是一种“回避型”的解决方案,在低版本的SpringBoot项目中有效,但是在高版本3.x中却不一定有效。

 方法解释:

1. 首先我们应该知道一件事:IDEA(IntelliJ IDEA)自带了Lombok插件,正常情况下我们在IDEA中编写"lombok代码"是能够正常运行(能正常“自动生成代码”)的。

 2. 当我们在项目Pom中引入了Lombok依赖之后,Lombok 注解处理器会在编译时被 Maven 加载并执行,生成 Lombok 注解(如 @Slf4j, @Getter, @Setter)所需要的代码但是引入后IDEA自带的Lombok插件优先级低于Lombok依赖提供的注解处理器。

3. 所以当引入Lombok依赖后,Maven代码编译时会优先寻找Lombok依赖提供的注解处理器(追踪依赖),如果没有,直接报错“找不到符号”,而不是去使用IDEA自带的插件去生成代码。

4.上面这个参数通过禁用 IDEA 的依赖追踪机制,让编译过程 忽略 Maven 构建时依赖检查失败的情况。这相当于告诉 IDEA:“不要强制检查这些注解处理器的依赖,不要因为 Maven 的编译失败而阻止代码编译。”

5. 这样一来,即使 Maven 没有找到注解处理器,IDEA 插件仍然可以继续使用,并且 Lombok 的相关代码仍然可以通过 IDE 插件自动生成,从而避免报错。

总结:添加VM选项参数jps.track.ap.dependencies=false实际上并没有解决根本问题,只是有忽略了问题导致的编译终止,让编译继续,使得IDEA的lombok插件可以兜底解决。

(并非所有IDE都默认支持lombok,所以这种解决方案理论上并不是最好的)

Pom配置插件解决

 合理的解决方案应该是我们到Pom文件中配置Lombok的注解处理器

<!-- pom.xml -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>版本号需要和boot版本匹配</version></path></annotationProcessorPaths></configuration>
</plugin>

配置好记得"clean"一下,然后重新maven编译,运行。 

正确配置后,当Maven编译时就能正确加载到Lombok注解处理器,使得"lombok代码"能正常生成,避免报错发生。 

值得注意的是:在配置如上插件的时候lombok版本最好填一下<version>版本号</version>

如果不显示填的话,大概率会从maven远程仓库调用下载最新版或稳定版的Lombok,自动下载的版本不一定和你SpringBoot项目版本兼容,依然会报错

所以,请到spring-boot-dependencies.pom中查看boot项目版本对应的Lombok版本

文件查找路径/方法:

最后总结:

1. 问题的核心就在于Lombok注解处理器没有被正确加载或配置,导致Maven在编译过程中报错,无法生成相应的代码。

~.~ | ``

2. 尽管使用VM选项参数 -Djps.track.ap.dependencies=false 可以避免报错,但最好是确保Maven的Lombok注解处理器配置正确,以确保Maven构建过程和IDEA插件共同协作,使得项目在任何构建环境下都能正确生成代码。

完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15102.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】redis 存储的列表如何分页和检索

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

基于SpringBoot的线上历史馆藏管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Redis持久化机制详解

为什么需要持久化 Redis通常被作为缓存使用&#xff0c;但是Redis一旦宕机&#xff0c;内存中的数据全部丢失&#xff0c;可能会导致数据库崩溃。如果是从数据库中恢复这些数据就会存在频繁访问数据库和读取速度慢的问题。所以redis实现数据的持久化&#xff0c;是至关重要的。…

代码随想录算法训练营day38

代码随想录算法训练营 —day38 文章目录 代码随想录算法训练营前言一、322. 零钱兑换二维dp数组 二、279.完全平方数二维dp数组 三、139. 单词拆分多重背包背包问题总结问题类型递推公式遍历顺序 前言 今天是算法营的第38天&#xff0c;希望自己能够坚持下来&#xff01; 今日…

数据库高安全—审计追踪:传统审计统一审计

书接上文数据库高安全—角色权限&#xff1a;权限管理&权限检查&#xff0c;从权限管理和权限检查方面解读了高斯数据库的角色权限&#xff0c;本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…

【C++篇】 异常处理

目录 1&#xff0c;异常的概念及使用 1.1&#xff0c;异常的概念 1.2&#xff0c;异常的抛出和捕获 1.3&#xff0c;栈展开 1.4&#xff0c;异常的重新抛出 1.5&#xff0c;异常安全问题 1.6&#xff0c;异常规范 2&#xff0c;标准库中的异常 小结&#xff1a; 1&…

QT修仙之路1-1--遇见QT

文章目录 遇见QT二、QT概述2.1 定义与功能2.2 跨平台特性2.3 优点汇总 三、软件安装四、QT工具介绍(重要)4.1 Assistant4.2 Designer4.3 uic.exe4.4 moc.exe4.5 rcc.exe4.6 qmake4.7 QTcreater 五、QT工程项目解析(作业)5.1 配置文件&#xff08;.pro&#xff09;5.2 头文件&am…

python实现情绪识别模块,并将模块封装成可执行文件

目录&#xff1a; 1.源码&#xff1a;2.情绪识别模型运行流程&#xff1a;3.模型封装需要注意的地方&#xff1a;4.未解决问题&#xff1a; 1.源码&#xff1a; https://gitcode.com/xyint/deep_learning.git 2.情绪识别模型运行流程&#xff1a; 需要获取用户摄像头权限&…

网络防御高级02-综合实验

web页面&#xff1a; [FW]interface GigabitEthernet 0/0/0 [FW-GigabitEthernet0/0/0]service-manage all permit 需求一&#xff0c;接口配置&#xff1a; SW2: [Huawei]sysname SW2 1.创建vlan [sw2]vlan 10 [sw2]vlan 20 2.接口配置 [sw2]interface GigabitEther…

Arbess基础教程-创建流水线

Arbess(谐音阿尔卑斯) 是一款开源免费的 CI/CD 工具&#xff0c;本文将介绍如何使用 Arbess 配置你的第一条流水线&#xff0c;以快速入门上手。 1. 创建流水线 根据不同需求来创建不同的流水线。 1.1 配置基本信息 配置流水线的基本信息&#xff0c;如分组&#xff0c;环境&…

MySQL下载过程

MySQL Enterprise Edition Downloads | Oracle mysql官方下载网址&#xff08;9.2版本&#xff09; 下面的示例是5.7的包&#xff0c;过程是一样的 port&#xff1a;3308&#xff08;默认的是3306&#xff0c;笔者下了一个占用了该端口&#xff09; root&#xff1a;123456 问题…

StochSync:可在任意空间中生成360°全景图和3D网格纹理

StochSync方法可以用于在任意空间中生成图像&#xff0c;尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型&#xff0c;以实现零-shot生成&#xff0c;消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization&#xff08;DS&…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

【多模态大模型】系列1:CLIP【多模态领域开山之作】

目录 1 模型结构2 伪代码3 Loss计算方法 官方网站&#xff1a;https://openai.com/index/clip/ 论文&#xff1a;Learning Transferable Visual Models From Natural Language Supervision GitHub&#xff1a;https://github.com/openai/CLIP Colab&#xff1a;https://colab.r…

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来&#xff08;优…

idea整合deepseek实现AI辅助编程

1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号&#xff0c;DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息&#xff0c;File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…

k8s部署elasticsearch

前置环境&#xff1a;已部署k8s集群&#xff0c;ip地址为 192.168.10.1~192.168.10.5&#xff0c;总共5台机器。 1. 创建provisioner制备器&#xff08;如果已存在&#xff0c;则不需要&#xff09; 制备器的具体部署方式&#xff0c;参考我之前的文章&#xff1a;k8s部署rab…

(done) openMP学习 (Day13: 线程私有数据和如何支持库(Pi again),蒙特卡洛计算 Pi,线性同余法)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 视频&#xff1a;https://www.bilibili.com/video/BV1SW411s7ST?s…

借助AI,轻松读好书

读书笔记 AI可以帮助我们写读书笔记&#xff0c;通过智能化的分类和标注技术&#xff0c;将我们的笔记进行分类整理&#xff0c;使其更加清晰易懂&#xff0c;帮助我们高效&#xff0c;准确&#xff0c;深入的总结和掌握书中的知识&#xff0c;实现更好的学习和成长。 《异类》…

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;语言模型的发展历程&#xff1a;从统计方法到大规模预训练模型的演化1 统计语言模型&#xff08;Statistical Language Model, SLM&#xff09;&#xff1a;统…