IDEA編寫SpringBoot項目時使用Lombok報錯“找不到符號”的原因和解決
概述|背景
報錯發(fā)生背景:在SpringBoot項目中引入Lombok依賴并使用后出現(xiàn)"找不到符號"的問題。
本文討論在上述背景下發(fā)生的報錯原因和解決辦法,如果僅為了解決BUG不論原因直接通過目錄跳到【解決方法】,如果發(fā)生背景不同請找其他博文尋求解決。
Lombok"找不到符號"代碼報錯一般位置:
1.代碼: log.info("日志內容.."); (使用了注解@Slf4j)
2.代碼:class.getX(); (使用了注解@Data)
報錯解析
1.為什么會出現(xiàn)“找不到符號”的報錯呢?
我們遇到這個報錯時一般都會想到:“難道是這個變量沒有定義?”,但是轉念一想我們所引用的是Lombok給我們提供的變量。
所以,我們應該去探索Lombok內部,我們在使用log(log.info("日志內容.."))變量時,到底發(fā)生了什么。
實際上,當我們編寫了代碼:log.info("日志內容.."),在項目編譯時遇到log變量,會發(fā)生的事情是自動幫我們補充了代碼:private static final Logger log = LoggerFactory.getLogger(...); 向我們提供了log這個變量引用。
所以,如果這段“自動生成的代碼”沒有自動生成的話,那么log變量自然就找不到,報錯"找不到符號"那也就合理解釋了。
當然,代碼:class.getX(); 原理也是一樣的,只不過自動生成的代碼不同罷了(這段代碼自動生成的是getter函數(shù))。
2.自動生成代碼的時機?
當我們明白了會報“找不到符號”的原因就是該自動生成的代碼沒有生成后,我們就該研究一下“使用lombok時何時幫我們自動生成代碼”。
我們在使用Lombok時一般都會在所在類上添加"lombok相關注解"。
例如:想使用日志log.info(),我們就該聲明注解"@Slf4j",當想要自動給類中所有字段添加Getter和Setter函數(shù)時就該聲明"@Data"對吧。
實際上這些注解就會成為自動生成代碼位置的錨點。
當項目代碼編譯時遇到這些注解,“lombok注解處理器”就會識別并生成相應代碼。
3.注解處理器-最終解釋
最終我們會把問題聚焦在"注解處理器是否正確加載"的問題上來。
因為如果lombok注解處理器沒有正確加載,那么當代碼編譯時遇到"lombok變量"自然就沒有辦法識別。
所以,我們下面我們的解決方案就是“讓注解處理器正確工作”。
解決方法
IDEA配置解決
添加VM選項-D jps.track.ap.dependencies=false
這是目前網(wǎng)絡上熱門的解決方法,但這是一種“回避型”的解決方案,在低版本的SpringBoot項目中有效,但是在高版本3.x中卻不一定有效。

方法解釋:
1. 首先我們應該知道一件事:IDEA(IntelliJ IDEA)自帶了Lombok插件,正常情況下我們在IDEA中編寫"lombok代碼"是能夠正常運行(能正常“自動生成代碼”)的。

2. 當我們在項目Pom中引入了Lombok依賴之后,Lombok 注解處理器會在編譯時被 Maven 加載并執(zhí)行,生成 Lombok 注解(如 @Slf4j, @Getter, @Setter)所需要的代碼。但是引入后IDEA自帶的Lombok插件優(yōu)先級低于Lombok依賴提供的注解處理器。
3. 所以當引入Lombok依賴后,Maven代碼編譯時會優(yōu)先尋找Lombok依賴提供的注解處理器(追蹤依賴),如果沒有,直接報錯“找不到符號”,而不是去使用IDEA自帶的插件去生成代碼。
4.上面這個參數(shù)通過禁用 IDEA 的依賴追蹤機制,讓編譯過程 忽略 Maven 構建時依賴檢查失敗的情況。這相當于告訴 IDEA:“不要強制檢查這些注解處理器的依賴,不要因為 Maven 的編譯失敗而阻止代碼編譯。”
5. 這樣一來,即使 Maven 沒有找到注解處理器,IDEA 插件仍然可以繼續(xù)使用,并且 Lombok 的相關代碼仍然可以通過 IDE 插件自動生成,從而避免報錯。
總結:添加VM選項參數(shù)jps.track.ap.dependencies=false,實際上并沒有解決根本問題,只是有忽略了問題導致的編譯終止,讓編譯繼續(xù),使得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代碼"能正常生成,避免報錯發(fā)生。
值得注意的是:在配置如上插件的時候lombok版本最好填一下<version>版本號</version>。
如果不顯示填的話,大概率會從maven遠程倉庫調用下載最新版或穩(wěn)定版的Lombok,自動下載的版本不一定和你SpringBoot項目版本兼容,依然會報錯。
所以,請到spring-boot-dependencies.pom中查看boot項目版本對應的Lombok版本。
文件查找路徑/方法:



最后總結:
1. 問題的核心就在于Lombok注解處理器沒有被正確加載或配置,導致Maven在編譯過程中報錯,無法生成相應的代碼。
2. 盡管使用VM選項參數(shù) -Djps.track.ap.dependencies=false 可以避免報錯,但最好是確保Maven的Lombok注解處理器配置正確,以確保Maven構建過程和IDEA插件共同協(xié)作,使得項目在任何構建環(huán)境下都能正確生成代碼。
延申出的問題
當我們解決掉了"找不到符號"的報錯后,很可能再后續(xù)的實際開發(fā)中會遇到的BUG:
1. 406:Not Acceptable
2.No converter for [class X] with preset Content-Type 'application/json;charset=UTF-8'].
因為出現(xiàn)過上面的問題,所以報錯這些很大可能是我們的lombok注解處理器仍然沒有能正常工作。
測試:我們可以手動的給報錯所在的類所有字段添加上Getter和Setter方法。
ps: 如果是用IDEA,可以使用快捷鍵【alt + insert】生成。
如果你發(fā)現(xiàn)手動添加上Getter和Setter方法后報錯消除,說明還是上面所說的問題。
解決
直接在IDEA設置中把注解處理器的獲取方式設為"從項目類路徑獲取處理器"。
設置后,應用,lean,重新啟動!

到此這篇關于IDEA編寫SpringBoot項目時使用Lombok報錯“找不到符號”的原因和解決的文章就介紹到這了,更多相關IDEA Lombok報錯找不到符號內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決java編譯錯誤( 程序包javax.servlet不存在javax.servlet.*)
這篇文章主要介紹了解決java編譯錯誤的相關資料,主要解決 程序包javax.servlet不存在javax.servlet.*的問題,需要的朋友可以參考下2017-08-08
Java常用鎖synchronized和ReentrantLock的區(qū)別
這篇文章主要介紹了Java常用鎖synchronized和ReentrantLock的區(qū)別,二者的功效都是相同的,但又有很多不同點,下面我們就進入文章了解具體的相關內容吧。需要的小伙伴也可以參考一下2022-05-05
淺析Java如何優(yōu)雅的設計接口狀態(tài)碼和異常
HTTP協(xié)議里定義了一系列的狀態(tài)碼用來表明請求的狀態(tài),如常用的200表示請求正常,404表示請求的資源不存在,所以本文就來和大家討論一下如何優(yōu)雅的設計接口狀態(tài)碼和異常,感興趣的可以了解下2024-03-03
SpringBoot使用Redis實現(xiàn)分布式緩存
這篇文章主要介紹了SpringBoot redis分布式緩存實現(xiàn)過程解析,文中通過示例代碼解析的非常詳細,感興趣的同學可以參考閱讀2023-04-04

