1. 程式人生 > >Spring 原始碼閱讀環境的搭建

Spring 原始碼閱讀環境的搭建

> **前言** > > 本文記錄了 Spring 原始碼環境的搭建方式,以及踩過的那些坑!​當前版本:5.3.2-SNAPSHOT。 ### 環境準備 1. Git 2. JDK 1. master 分支需要 JDK 11 2. 5.2.x 分支, JDK8 即可 3. Gradle 6.5.1 4. IDEA 最新 (2020.2.3) Spring 原始碼倉庫地址:[https://github.com/spring-projects/spring-framework](https://github.com/spring-projects/spring-framework) ### 下載原始碼 1. clone 原始碼 ```bash git clone https://github.com/spring-projects/spring-framework.git ``` 2. 使用 IDEA 開啟 1. ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/nN2jwC-B9crax.png) 2. ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/SmFKEX-Rikm9z.png) 3. 等待 IDEA 載入完成即可。 注: 也可以指定 clone 的分支 ```bash git clone -b 5.2.x https://github.com/spring-projects/spring-framework.git ``` 或者先 fork 到自己的倉庫,然後再 clone。 ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/larIO8-qFY4Fo.png) 這裡我是 fork 到我的倉庫,然後再 clone 的。 當前 master 分支代表的版本為 5.3.2-SNAPSHOT。 ### 執行測試 - 在專案右鍵建立 `module` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/qkYNup-hSgF5s.png) - 選擇 `Gradle` `Java` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/v9YDiM-0D64W2.png) - 建立 module ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/iYepMg-WRomfs.png) - 在 build.gradle 中新增配置 ```text compile(project(":spring-context")) ``` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/SUhEs6-2JKywY.png) - 建立測試類並測試 ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/O55vLL-XSueLY.png) 其中 `UserComponent` 添加了 `@Component` 註解, 程式正常執行則一切 OK。可以開始愉快的除錯程式碼了。 ### 問題總結 #### 編譯失敗 有小夥伴直接下載 zip 包,可能遇到以下問題:(非常不建議直接下載 zip 包構建,想知道原因可以繼續看,最後我也沒有構建成功,而是直接通過 clone 構建的。) 1. 報錯如下: ```text fatal: not a git repository (or any of the parent directories): .git BUILD SUCCESSFUL in 14s Build scan background action failed. org.gradle.process.internal.ExecException: Process 'command 'git'' finished with non-zero exit value 128 ... 其他省略 ``` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/4mqrY9-o9NJO6.png) 看意思是沒有 git 配置,那就新增上吧! 2. 這時候想著新增 git `VCS` -> `Enable Version Control Integration...` -> 右上角 `Reload All Gradle Projects` 依然報錯 ```text fatal: Needed a single revision ``` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/zLWbqb-rkJFw4.png) 3. 查詢問題 issues 地址:[https://github.com/spring-projects/spring-framework/issues/24467](https://github.com/spring-projects/spring-framework/issues/24467) 建議使用 ```bash $ git clone [email protected]:spring-projects/spring-framework.git ``` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/siVXre-hle4kw.png) 意思就是 zip 發行版主要是用來共享原始碼,但不一定用於構建它。 4. 最後我選擇了使用 clone 的方式,直接 clone 下來,然後 build 通過。 #### 缺少 cglib 和 objenesis 包 ```text Kotlin: warnings found and -Weeror specified ``` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/Xnip-2020-11-24-06-DhRwoS.png) 沒有 `spring-cglib-repack` 和 `spring-objenesis-repack` 包 ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/2fNVjI-71xWmS.png) 執行這兩個即可。 #### 找不到包 jdk.jfr ```java import jdk.jfr.Category; import jdk.jfr.Description; import jdk.jfr.Event; import jdk.jfr.Label; ``` JDK 升級為 11。因為我本地使用的是 JDK8,發現報錯,jfr 包需要升級 JDK 11 才有。 如果不生效,可以通過: IDEA -> `File` -> `Project Structure` -> `Project` 檢查下是否修改為 JDK 11 快捷鍵:`⌘ + ;` ![](https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/article/ost9dI-pTohuz.png) #### 相關資料 1. Spring 倉庫:https://github.com/spring-projects/spring-framework 2. Spring 構建文件:https://github.com/spring-projects/spring-framework/wiki/Build-from-Source #### 歷史文章 - [ReentrantLock 原始碼、畫圖一起看一看!](https://mp.weixin.qq.com/s/_z4KaFip3qz2fynviMYiRQ) - [ReentrantReadWriteLock 的原理!](https://mp.weixin.qq.com/s/yIzAe3kb0HCphzm1Evv-Tw) - [Spring 自呼叫事務失效,你是怎麼解決的?](https://mp.weixin.qq.com/s/BORxKatt9qs4rDg