版本工具:IntelliJ IDEA 2018-3,gradle4.9,jdk1.8.0_181,spring5.1.x, kotlin1.2.41,groovy2.4.12,
編譯spring源碼的方式有很多方式,小編知道的就有兩種,一種是gradle編譯,一種是藉助編輯工具編譯,比如說eclipse和IDEA,這裏就拿IDEA舉例說明。
gradle 和 jdk的安裝這裏就不再複述,度娘查一下很easy,基本操作,下面直接開始源碼編譯。
- 導入之前,我們先看源碼根目錄中的import-into-idea.md文件
注意幾點:
- 因爲其他項目需要依賴spring-core和spring-oxm,所以我們導入後需要先編譯這兩個包
- spring-aspects需要依賴三方jar,所以這裏編譯可能會報錯,但是不影響我們編譯使用,讓我們忽略這個錯誤
- 使用工具編譯時,我們需要調整寫參數避免出現內存溢出導致編譯不通過 -XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
- 在IDE中編譯spring的源碼,必須要先生成spring-oxm模塊的資源
- 將源碼導入到IDEA(將源碼導入IDEA有兩種方式), 源碼地址:https://github.com/spring-projects/spring-framework.git
- 將源碼下載到本地,解壓之後導入到IDEA中
- 使用IDEA的git插件,直接從github上將代碼導入到項目中
- 首先我們打開IDEA,選擇地下的check pout from version control,選擇git方式
- 輸入源碼地址和本地的目錄,然後等待源碼下載完成
- 選擇使用gradle方式導入
- 注意截圖部分中的配置項,選擇自己本地安裝的gradle,jdk的版本要1.8以上,對應的虛擬機參數調整
- 點擊Finish,等到IDEA導入成功之後,我們切換下代碼的版本,當前down下來的最新的是master版本,這裏我們要編譯的是5.1x版本,切換到版本5.1x後,IDEA會自動構建
- 項目在構建項目的時候可能會出現以下錯誤
- No such property: immutableValues for class: org.gradle.api.internal.tasks.DefaultTaskDependency,圖截圖所示錯誤解決辦法:註釋模塊spring-bean中的spring-bean.gradle文件中的截圖部分代碼
- Could not find method useJUnitPlatform() for arguments ,錯誤如圖所示解決辦法:註釋掉模塊spring-test中的spring-test.gradle文件中的截圖部分代碼
- 小編在build兩次之後,只出現了以上兩處錯誤
- 下面開始編譯spring-core的代碼
- 以同樣的方式分別去編譯sping-bean spring-context spring-oxm模塊
- run test的時候,可能會出現以下錯誤。產生問題的原因:sping-core會依賴兩個核心的jar 解決方法:cmd窗口進入到sprng-core目錄,執行命令gradle build,直到出現BUILD SUCCESSFUL,如圖所示:
- 出現這個異常Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 解決方法:在cmd窗口查看自己kotlin的版本
- 修改工程根目錄下的build.gradle文件中的對應kotlin版本號(編譯通過後,小編無意還原了github上的代碼,kotlin的版本回滾到了1.2.71,發現並不會影響到源碼的編譯,這個可以忽略,但是也可以作爲一個參考點)
- 以及IDEA編輯器中的kotlin版本
- 重新run test。 在run test其他模塊的過程中,可能會出現,有些錯誤是可以忽略的,在你無法鑑定這個錯誤是不是可以忽略的時候,你就直接執行下面的步驟,新增module來測試代碼能不能運行,debug能不能調試到spring源碼中去,這裏好像沒有一個絕對的標準
- 新增Module來測試源碼編譯是否通過
- 右鍵spring工程,新增一個module
- 選擇gradle Module,下一步
- 輸入模塊名稱,下一步,然後finish,新增module成功
- 維護新增module對spring-context的依賴關係
- 編寫測試代碼
- 右鍵run Test.Main,查看輸出結果
- 至此,sping源碼在IDEA中編譯完成,大功告成。