spring源碼編譯完整步驟拿來即用!
1.版本選擇
1)源碼版本:spring5.3.x
2)gradle版本:根據spring源碼的工程路徑:gradle/wrapper/gradle-wrapper.properties文件查看gradle版本。如圖所示:
可以看到源碼版本對應gradle版本為,所以可依此下載gradle-7.2版本,注意這裡請保留gradle-7.2的zip壓縮包,後面會用到
3)JDK版本:可以根據如下路徑中的ide.gradle選擇JDK版本,這裡是JDK1.8
4)IDEA版本:盡量選擇較高版本:我用的是2021.3.2版本
2.環境準備
1)gradle安裝並配置環境變量,此步驟可自行百度
2)ieda配置gradle的存儲jar包倉庫,如圖所示:
進入idea的全局設置,可以先打開一個工程,然後再file選項下選擇close project 關閉工程可回到此界面
在這裡配置gradle倉庫路徑,用來存儲gradle編譯spring源碼時下載的各種jar包
3)spring源碼工程構建前相關文件修改配置
1.maven倉庫下載路徑修改:因為github下載的源碼中maven倉庫路徑是國外地址,此處可更改為阿里雲倉庫,gradle編譯時下載jar包速度會極大提升
文件路徑: spring-framework/build.gradle
在build.gradle文件中找到repositories 代碼塊,配置如下路徑,或者可以自行登錄 【阿里雲maven倉庫地址://developer.aliyun.com/mvn/guide】選擇url路徑配置
repositories { maven { url "//maven.aliyun.com/repository/public" } maven { url "//maven.aliyun.com/repository/apache-snapshots" } maven { url "//maven.aliyun.com/repository/gradle-plugin" } maven { url "//repo.springsource.org/plugins-release" }//國外路徑 maven { url "//repo.spring.io/libs-spring-framework-build" }//原始路徑 mavenCentral() }
2.gradle/wrapper/gradle-wrapper.properties文件修改
默認文件配置如圖所示,當我們將項目導入idea時會根據標紅地址下載gradle-7.2-bin.zip壓縮包,由於前面我們自行下載並配置了gradle,不需要重新下載
修改為如下路徑:即存放 gradle-7.2-bin.zip文件的路徑
distributionUrl=file\:///D:/Java/gradle-7.2/gradle-7.2-bin.zip
3.spring源碼導入ieda
1)直接選擇open打開工程
2)此時idea會為源碼項目創建工作空間,等待創建完成後會立即開始構建項目,我們不要着急構建項目,還需要在IDEA中為spring源碼項目配置gradle和JDK,點擊停止按鈕打斷構建,如下所示
3)給項目配置gradle和jdk
配置如下圖:先配置圖一再配置圖二,
file->project Structure->project
file->settings->gradle
點擊確認後,項目就會開始自動build,此時無需其他操作。
4.開始構建
1)當所有模塊build完成後,提示finished表示成功
如下的報錯信息可以忽略,這個是與git相關的報錯信息,不影響spring源碼編譯
2)為確保所有模塊都構建成功,這裡可以參考官方spring源碼工程中的 import-into-idea.md文檔描述:先編譯spring-oxm模塊
在gradle中使用spring-oxm的 compileTestJava選項編譯此模塊(雙擊運行即可),具體位置如圖
3)此時再選擇spring下的build選項編譯整個源碼項目
4)編譯過程中出現spring-web模塊編譯失敗。如下
注意報錯的類和報錯行:Jackson2JsonEncoderTests.java 的253行,找到這個類,將253行注釋掉,如下:
為什麼要注釋掉:隨意測試出來的,看過這個 jacksonValueUnwrappedBeforeObjectMapperSelection()方法的提交記錄 是由spring團隊2022.3.16提交的,注釋掉不知道是否會影響spring-web模塊的引用。
5)重新build ,即重複 3)步驟,編譯成功
至此,spring源碼編譯就成功了
5.新建模塊用於測試
此步驟省略不寫,主要記錄幾個踩過的坑
1.gradle7版本和gradle5版本之間用重大升級更新 舊版本的compile關鍵字在新版本中已經棄用 ,換為 implementation關鍵字,引用項目時需要注意
2.新建模塊並且已經引入了其他模塊,編碼測試時發現引入項目沒生效
此時應該要檢查自己gradle編譯工具的新建模塊下的runtimeClasspath下有沒有自己引入的模塊,沒有就說明引用沒成功
解決辦法:
先將新建模塊下的測試代碼(引用其他項目中類的代碼)注釋掉,再重新build整個spring項目,就可以引用成功了
6.spring源碼項目的拉取的技巧分享
step1:先登錄自己的github賬號,將spring-framework 項目fork到自己的github倉庫,複製fork到自己的spring源碼倉庫的url
step2:登錄自己的gitee的賬號,選擇從github導入倉庫
將url填寫到如下位置,點擊導入即可將源碼項目複製到自己的gitee中,從本地拉取速度會相當快,也可以提交自己測試代碼用於總結學習