Spring 原始碼閱讀環境的搭建
阿新 • • 發佈:2020-11-27
> **前言**
>
> 本文記錄了 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