Spring源碼調試環境搭建

一、實驗環境

1.jdk1.8.0_171

2.gradle-5.3.1(Spring源碼使用gradle構建的,關於gradle的安裝和配置使用,請讀者自行上網搜一下,這裏不再贅述)

3.IntelliJ IDEA 2019.2

4.Spring-5.0.x

二、環境搭建

1.進入到GitHub官網並搜索spirng,找到對應的spring-framework工程,點擊鏈接進入,如下圖:
圖一
2.切換到自己想要的spring源碼版本,如下圖:
圖二
3.獲取Git分支鏈接(我這裏是用idea的git拉取源碼,大家也可以把源碼下載下來,再用idea導入,視個人習慣而定),如下圖:
圖三
4.在idea中用git拉取spring源碼,(筆者已經拉取過spring5.0.x的源碼,這裏重新下載5.1.x來做演示,筆者編譯的版本還是5.0.x的源碼)如下圖:
圖四
圖五

4.1 開始下載源碼(需要等幾分鐘,等待下載完):
圖六
4.2 下載完彈出導入窗口,如下:
圖七
5. 導入源碼,點擊Yes後彈出導入窗口,如下(之前如果配置過gradle,這裏不用作修改):
圖八
5.1 點擊OK後,開始構建(如果是第一次導入,需要下載依賴,可能需要等待一段時間,耐心等待依賴下載完成),如下圖:
圖九
5.2 導入完成後,如下圖所示,可能spring-core項目可能會報錯(如果沒有報錯,自己 重新構建 build --> build project,看有沒有報錯),這是由於 爲了避免第三方class文件的衝突,Spring把最新的cglib和objenesis重新打包後放在了jar包中,並沒有放在源碼中,從而導致編譯錯誤,需要我們自己導入這兩個jar包
圖十圖十一
6.解決上面源碼中缺失cglib和objenesis的問題,網上給的解決方法是手動下載這兩個jar包放到項目中或是自己用jar命令打包,筆者這裏用gradle提供的打包工具解決以上問題,如下圖(點擊下圖所示的gradle命令,運行完即可):
圖十二
圖十三
運行完兩個命令後,發現spring-core項目中的build目錄中已經存在了這兩個jar包:
圖十四

7.引入以上連個包後, 重新構建 build --> build project,可能會報如下錯誤,只是些測試類的錯誤,不影響源碼閱讀和調試,把報錯的單元測試類刪掉即可,想解決的朋友可以自己搜索資料解決。
圖十五圖十六

8.解決了以上問題後,再重新編譯,又報了以下類找不到的錯誤,發現這回不是單元測試類的錯誤,需要解決一下。這個錯誤提示是找不到AnnotationCacheAspect這個符號,而我們打開項目目錄,發現可以找到AnnotationCacheAspect.aj這個文件,打開這個文件,發現是類的聲明使用的是aspect而不是class,idea默認使用的編譯器是javac,javac編譯器肯定是識別不了 public aspect這樣的語法的,java是不支持aspect這樣的關鍵字的,aspect這個關鍵字是AspectJ才能識別的關鍵字,AspectJ是實現AOP編程的,spring-aspects這個項目和AOP有關,所以就需要用到AspectJ,需要AspectJ的編譯器Ajc來對和AOP有關的*.aj文件進行編譯。
圖十七
8.1 AspectJ最新版下載(下載jar包):
圖十八
8.2 AspectJ安裝

打開命令行,cd到AspectJ的jar包所在的文件夾,運行java -jar aspectj-1.9.4.jar命令,打開AspectJ的安裝界面,直接點擊Next,如下圖:
圖十九
接着選擇jre的安裝路徑,繼續Next。
圖二十
接着選擇AspectJ的安裝路徑,然後Install安裝。
圖二十一
安裝完成後在idea下配置AspectJ, 只有專業版的IntelliJ IDEA才支持AspectJ的開發,而且idea也提供了官方文檔

首先idea安裝AspectJ支持插件,下圖的兩個插件:

圖二十二
8.3 爲spring-aspect 工程添加Facets屬性,步驟如下:

File --> Project Structure --> Facets
圖二十三
選擇spring-aop.main
圖二十四圖二十五
再選擇spring-aspects.main
圖二十六圖二十七
8.4 更改idea編譯器,使idea能夠編譯*.aj文件,步驟如下:

Settings --> Build, Execution, Deployment -->Compiler -->Java Compiler

將編譯器改爲 Ajc,接着設置Ajc的安裝目錄,選擇到aspectjtools.jar,同時,一定要將Delegate to Javac選項打鉤,這個代理設置的作用是隻將上面添加了Facets屬性的AspectJ項目用Ajc編譯器編譯,其他的項目還是用默認的javac編譯器編譯。如果不勾選這個代理選項,則全部項目都使用Ajc編譯器編譯,可能會導致編譯錯誤。
圖二十八
如果有下圖的錯誤,不要緊,只是idea對*.aj文件的語法要求,對編譯項目沒有影響。
圖二十九
設置完以上步驟後,重新編譯,就可以編譯成功了,編譯成功打印日誌如下:
圖三十
至此,整個spring-framework5.0.x項目就編譯完成了,就可以閱讀和跟進調試spring源碼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章