編譯Spring原始碼的步驟及一些問題

矮萌傑;發表於2020-12-13

步驟

下載對應工具

1.下載gradle,使用下載好的gradle進行編譯,不需要太新,但是版本一定要匹配(好像沒碰到版本衝突問題,注意一下就得了)。

gradle網址:https://services.gradle.org/distributions/

下載好後記得配置環境變數

方式一:
1.新增環境變數GRADLE_HOME->檔案安裝目錄
2.配置Path新增%GRADLE_HOME%bin即可

方式二:
直接在path新增下載好的gradle的bin目錄即可。

環境變數截圖
在這裡插入圖片描述
在這裡插入圖片描述
通過gradle -v命令測試環境變數是否配置好

在這裡插入圖片描述

2.IDEA安裝kotlin,只需要在setting->plugins搜尋這個外掛下載安裝在重啟IDEA即可。
在這裡插入圖片描述
3.下載Spring原始碼

下載地址: https://github.com/spring-projects/spring-framework/tree/5.0.x

在這裡插入圖片描述

編譯部分

1.進入到下載好的原始碼目錄,通過命令列cmd去執行gradlew.bat命令。我試了直接點gradlew.bat命令,但是最後編譯完成就消失了,也不知道結果是成功還是失敗。

這裡碰到了編譯失敗的問題,後面統一說明BUG問題。

執行完後會提示BUILD SUCCESSFUL,即表示成功

補充說明

這裡補充一下,下載好的Spring原始碼中有import-into-idea.md這個檔案,裡面有一些說明。

在這裡插入圖片描述
譯文(推薦用有道翻譯):
在這裡插入圖片描述

總結就是:
1.先編譯那兩個基底包
2.aspects可能會有錯,可以在build.gradle檔案說將其排除掉
3.有一些測試的問題需要調整引數
4.必須通過命令來測試某個模組

在執行完gradle.bat命令後,我就直接做了1和4。直到可以跑通原始碼也沒做2和3。所以在過程中可能出現比較多的問題吧。

結果圖:
在這裡插入圖片描述

2.匯入IDEA

這個就直接匯入即可,然後他就會自動下載。

我找網上的資料,都是說匯入的時候讓你對gradle專案進行一些設定。但是不管我用什麼方式匯入,都沒有設定的選項。

所以我在把專案匯入IDEA後先手動停止他下載依賴,我進行了一些配置在重新重新整理。

修改配置圖:
在這裡插入圖片描述
在這裡插入圖片描述

重新下載依賴:
在這裡插入圖片描述
這裡需要一定的時間,所以耐心等待。建議在網路較好的環境下進行,避免不必要的問題(超時等等)

最後下載成功:
在這裡插入圖片描述

測試

1.在Spring-context模組中,通過自己的方式建立上下文,我使用的是註解。

2.編寫一個實體類和啟動程式,啟動程式中建立Spring容器並獲取對應實體bean物件。

在這裡插入圖片描述

補充說明
可以通過寫註釋,打斷點的方式看是否跳到對應的程式碼行

需要注意,修改完註釋後需要重新編譯(執行右邊gradle下的build中的jar命令),這樣才能保證修改的註釋生效。(因為編譯後的是class位元組碼檔案,我們在後面也是引入是位元組碼檔案,在java程式碼編寫完後重新打包編譯生成位元組碼後,新的註釋才能生效)

在這裡插入圖片描述

其他工程引入自己編譯的原始碼

編譯自己的Spring原始碼肯定是想要在自己的Demo工程中去進行引入測試,看看其執行流程或者是程式碼如何編寫的。

但是直接從maven下載的都是read-only的,不能在上面寫一些自己理解的註釋,所以才匯入了自己編譯的Spring原始碼。

匯入過程:

進入專案環境
在這裡插入圖片描述

選擇library:
在這裡插入圖片描述

先引入執行的位元組碼檔案:
在這裡插入圖片描述

然後引入source資源目錄:
在這裡插入圖片描述

最後,我移除了maven下載的官方包

最終結果:
在這裡插入圖片描述

其他涉及到的模組也類似這樣處理。

補充問題

這裡需要說明一下,對於引入位元組碼和source我是這樣理解的。

引入class位元組碼只是告訴JVM執行的時候位元組碼檔案在哪,在執行的時候你只需要載入我對應目錄的位元組碼檔案去執行就可以了。

而進入source資源只是為了我們點進原始碼中,能看到原始碼,並在原始碼上新增屬於自己的註釋。

所以,當我們修改原始碼註釋的時候,需要重新編譯打包成位元組碼檔案,新的位元組碼檔案就會替換掉舊的。JVM在執行載入的時候才能顯出我們新修改過後的原始碼。

這樣就避免了修改了註釋,重新DEBUG的時候直接跳過斷點的問題。

碰到的問題

最主要的問題是gradle編譯和使用IDEA引入下載依賴

這裡我兩者都會出Build Fail

報的錯就是Could not resolv xxx.jarCould not get https://abc.123xyz.com/xxx.jar 大概就是一些無法下載編譯包的問題。這裡也找了很長時間,確實是一個大坑。

這塊的話我主要是新增倉庫來源來解決他:

增加了google()jcenter()。還有一些例如hibernate-validator下載不下來,我直接去maven倉庫找到其下載路徑,單獨引入進來

引入到倉庫後,在dependencies塊中也要新增complie xxxx標識,具體從maven倉庫中賦值。

強烈建議:在使用命令列編譯的時候就修改build.gradle中的倉庫映象,這樣能大大加快速度並且減少不必要的報錯

maven倉庫地址:https://mvnrepository.com/

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

其他的問題:

其他的問題我是沒碰到,但是其他小夥伴好像出現了版本不匹配,編譯出錯的情況。

這一塊的話,好像是不能太高的版本,也不能太低,包括JVM,Gradle,Kotlin

這裡我Kotlin沒有修改過,JDK是1.8的環境,Gradle是4.3.1,編譯的Spring是5.0.2 RELEASE

但是,最終在執行的時候報了一個錯。

是某一個類實現的介面的方法不全,我通過alt+enter直接將其完成了一個空實現,最後程式能正常跑通。

關於這一塊,以後在碰到的時候在進行處理,畢竟走了一下簡單的時序流程,發現沒有什麼太大的問題。主要功能好像也沒受到影響,所以就不在細去解決這個空方法的問題,畢竟原始碼這個東西也不是說一天兩天就搞得明白的,況且也不需要對原始碼的每一行都進行理解

小結

這塊我自己是一波三折,找了很多文章和解決辦法終於是把他解決了。

最主要的是一定要在網路條件較好的情況下進行,我自己是出現了幾次time out的情況,浪費了一些時間。

在編譯的過程中,耐心等待即可,因為涉及到的依賴包實在是太多了。

最重要的是解決辦法的思路,也不能一股腦的就複製貼上到百度,提煉一下關鍵點。

我在處理下載依賴下不下來的時候,我也是後面才慢慢想到是倉庫源的問題,然後又牽扯到maven倉庫。

畢竟之前一直都是用maven,想到maven可以直接把東西下好放到對應的本地倉庫地址中去,然後IDEA在下載的時候會先檢查本地,這時我通過手動已經下載並複製進去了,那麼IDEA就檢查到了。

類比到Gradle,找到倉庫下載源,新增到repositories中去,果然就download下來了。

過程中也參考了一些夥伴的文章,提供了不少的思路:

https://blog.csdn.net/qq_35576976/article/details/105616432?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

https://blog.csdn.net/m0_37615458/article/details/103804927

https://blog.csdn.net/weixin_43286186/article/details/96479324

相關文章