使用工具:JDK1.8.0_11、Gradle4.9、idea2018.1.3
1. 配置Gradle
Gradle下載地址:https://gradle.org/releases/
在下載頁找到自己需要的版本,點擊“binary-only”,只下載運行包。
注意:不建議下載比較新的gradle版本,可能使用時會有各種沖突,我選擇的是v4.9。
下載后的壓縮包:gradle4.9-bin.zip
解壓壓縮包
配置環境變量:右鍵計算機->屬性->高級系統設置->環境變量,在系統變量區域,點擊新建,輸入變量名為:GRADLE_HOME,變量值為:D:\Software\Gradle\gradle-6.1.1(根據實際情況)。找到Path,在原始內容基礎上加入%GRADLE_HOME%\bin;,必須以分號結束。
最后重新打開cmd命令行,輸入:gradle -v 檢查是否配置成功。
2. 下載Spring源碼
Git地址:https://github.com/spring-projects/spring-framework
下載地址:https://codeload.github.com/spring-projects/spring-framework/zip/5.1.x
打開這個地址,當前最新的版本是的Spring5.1.x版本的源碼地址,如果要下載其他版本,可以點擊紅框處修改。
點擊Clone or download 下載Spring的zip壓縮包。
3. Idea導入Spring源碼
1. 打開Idea,選擇File---> New --> Project form Existing Sources
2. 選擇要導入的spring-framework-5.0.x源碼項目
3. 選擇使用Gradle項目
4. 設置導入參數
選擇"Use auto-import",表示同時下載相關依賴。
選擇"Use local gradle distribution",表示引用本地的Gradle Home,選擇安裝的本地文件目錄。
在"Gradle VM options:" 官方推薦在編譯時把內存設置成2048M,內容: -XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
選擇"OK",Idea就會自動編譯,如下圖:
這個過程只能算是下載編譯時需要的依賴包,並不算真正的編譯,整個過程根據網絡情況時間不同,大概1個小時左右。依賴下載成功后的樣子是這樣的。
4. 導入時的常見錯誤
4.1 Uninitialized object exists on backward branch 365
出現這個錯誤,在網上翻閱了一些資料,都說是與JDK版本沖突造成的。
方案1:換其他版本的JDK挨個試。
方案2:點擊“Open File”,會打開如下文件build.gradle文件,指定到我當前的第15行內容。把org.jetbrains.dokka的version的版本改小,再保存嘗試編譯,我改到0.9.15的時候才能正常編譯。
4.2 Uninitialized object exists on backward branch 129
這個錯誤我是編譯5.0.x版本的Spring源碼出現的,這次報錯的插件是kotlin,同樣需要打開build.gradle文件,修改第14行org.jetbrains.kotlin.jvm的版本,我是改成了1.2.61可以正常編譯5.0.x版本的。
4.3 No such property
點擊“Open File”,會打開如下文件spring-beans.gradle文件,把下面第28行代碼注掉。
4. 編譯代碼
在上面都執行完畢之后,只是完成了依賴包的下載,還沒有真正的編譯。在源碼包的根目錄下有個描述文件import-into-idea.md,大概意思是需要先編譯spring-core和spring-oxm,這是其他模塊的依賴,spring-aspects在編譯時會報錯,但不影響。
1. 首先編譯核心項目spring-core、spring-beans、spring-context、spring-oxm,(盡量按照這個順序執行,編譯完核心包之后,其他的項目編譯順序就無所謂了)打開要編譯的項目的test目錄,在org.spring.framework路徑上右擊,選擇“Run 'Test' in 'springframework'”
2. 錯誤1:我在執行test的之后還報錯了,錯誤如下:
解決辦法:這個主要是Kotlin插件的版本問題,解決方案是更新新版本的Kotlin插件。在idea 工具中File->Settings->Plugins輸入Kotlin更新。插件更新之后要重啟idea。
錯誤2:在運行測試用例時可能會提示cglib包找不到的問題
解決辦法:在spring framework目錄下執行gradle命令:
gradle objenesisRepackJar
gradle cglibRepackJar
這樣就會下載包括cglib相關的依賴的了。
錯誤3:spring-oxm的特使用例,缺少Flights、Flight對象,這兩個對象就是在測試用例目錄的,就是沒有,把這幾個報錯類注掉吧
3. 再次執行Run 'Tests' in 'springframework',等待直接結束,可能偶給別tests方法執行失敗,可以忽略不計。(注意:如果運行時提示一些類找不到,可以先把錯誤的類注掉)
4. 執行Run Tests結束后,項目中會顯示out文件夾,存放的是編譯后的class文件。
5. 按照此方法,依次編譯其他項目,至此,Spring源碼編譯完畢。
5. 測試
編譯完成之后,在spring源碼項目新建一個Module,選擇gradle類型。
在新項目里的build.gradle文件中引用spring其他模塊,如下:
dependencies {
compile project(":spring-context") compile project(":spring-core") compile project(":spring-beans") testCompile group: 'junit', name: 'junit', version: '4.12' }
編寫測試代碼,我這里包括三個類:1個dao,一個config,一個啟動類
@Repository
public class IndexDao { public void query(){ System.out.println("IndexDao query"); } } @Configuration @ComponentScan("dao的路徑") public class AppConfig { } public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); IndexDao dao = context.getBean(IndexDao.class); dao.query(); } }
查看Test類是否能正常運行,並查看運行結果,如果運行結果是IndexDao query,則證實Spring源碼完全編譯成功。