最近呀,有小伙伴提出 自己在學習 Spring 的時候,這個源碼環境有些搞不定。 那這怎么能行,不能因為這點小困難就讓小伙伴放棄呀。
這里咱就不在贅述讀Spring源碼的好處了吧,想干這行的應該都懂。
今天就是要帶那些想要學習 Spring 源碼的小伙伴,手把手帶大家把這個源碼編譯好,這活盡量呀,給大家得整的漂亮點。
這里說明下,這個操作過程不需要科學上網,但是,注意了,這里有個但是,你總得保證你的電腦能上網吧。
考慮到有的小伙伴可能因為網絡原因可能訪問不了 github 或者下載非常慢,那這種情況的小伙伴也可以選擇看我那期一招搞定 github 訪問慢的文章。
當然不搞也沒關系,文章中涉及的源碼和工具包指北君也都會打包下載好最后給到大家,那來吧,直接開搞。
下載Spring源碼
這里有的小伙伴可能不知道源碼在哪下載,沒關系!這里的思路一般是我們要搞某個技術,第一反應就是先上它的官網。直接在搜索欄輸入 Spring,就能看到它的官網了。
打開 Spring 的官網:https://spring.io/
Spring 全家桶包含的項目有很多,我們選擇我們今天要搞得 Spring 框架:
這里你就可以看到最新的正式發布版本已經是 5.3.8 的,真的是更新的好快,反正咱們是學習(實際項目千萬別用最新版本),這里我就帶大家來編譯最新的版本,這樣大家也可以學習到最新的功能特性。
當然了這個版本不重要,你也可以選擇其他版本,咱今天是授人以漁,不是授人以魚,重要的是學習這個方法,你看完后想編譯啥版本就編譯啥版本。
我們點擊右上角的 github 圖標就會跳轉到 github 上面的源碼項目了。
下載方式可以直接通過 git clone 或者 下載 zip 包自己解壓下,我這里是直接下載 zip 包了。
下載地址:
https://github.com/spring-projects/spring-framework/releases
閱讀Spring的官方編譯文檔
其實呀,很多搞不定 Spring 源碼編譯的小伙伴,肯定很多都是去網上隨便找個教程,結果各種踩坑,因為搜到的資料參差不齊,這點估計大家都深有體會了。
所以我們就要養成一個習慣,必須要看官方文檔。這里也不是要求大家其它資料不看,畢竟也有很多優秀的博客,大家都是成年人,肯定是全都要嘍。
官方文檔一般都是英文,但是別害怕,我這個大學四級都考了三回的英語渣,都能勉強看,大家肯定都沒問題了,況且咱可以借助翻譯插件嘛。
如何編譯 Spring 源碼其實 Spring 官方提供了詳細的文檔,有離線版也有在線版,也就是開源項目都有的 REDAME 文件。
我這里選擇離線版來演示吧。我們解壓進入到下載好的 Spring 框架源碼項目下,查看 REDAME 。
就會發現有一個 build from source 的章節。
點擊這個鏈接,就會看到詳細的編譯構建 Spring 框架源碼的文檔了:
https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
接下來,咱們就按照文檔來編譯 Spring-Framework5.3.8 版本的源碼。 根據文檔的說明,首先我們要有一個 JDk8 或者更高的版本環境,我電腦安裝的是 JDk11 所以沒啥問題。 然后要安裝 Git,用來拉取源代碼的,因為我們已經下載了源代碼,就不管它了。
修改配置
先別著急,在編譯構建之前,教大家一絕招。這也是我在編譯過程中實踐出來滴心得。
從本地下載gradle
因為第一次運行就會去下載 gradle 到本地,然后通過 gradle 來編譯 Spring 源碼。 這個就很慢了,外網服務器下載,你懂得,有被墻的風險,并且本身也賊慢。
那為什么開始編譯構建就會自動下載 gradle 呢?從哪里下載?下載的版本是多少?
我們打開 Spring 源碼的根目錄:
配置文件的地址就是源碼根目錄的二級目錄下的 gradle-wrApper.properties 文件。
打開文件包含下列內容:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-6.8.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
- distributionUrl:表示的就是 gradle 的下載地址,默認配置的是一個遠程 URL。
- distributionBase:下載后存放的目錄,默認就是用戶目錄下的 .gradle 目錄;
- zipStoreBase:解壓后存放的目錄
我在構建的過程中發現配置的下載地址下載非常慢,經常超時,甚至有時候被墻。
所以我們倒不如先下載到本地,然后修改配置文件從本地獲取 gradle,這樣一來編譯構建就會快很多了。
我們只需要修改 gradle 的下載地址就好了,其他的配置項建議保持不變。
上述配置的意思就是如果我們運行 gradlew 會自動去 file
:///Users/sevenluo/IdeaProjects/spring-simple/gradle-6.8.3-bin.zip 這個目錄下載一個 gradle 到當前用戶的 .gradlewrapperdists目錄 ,然后解壓到當前用戶的 .gradlewrapperdists 目錄。
但是實際目錄不是這個,這個命令還會自己生成一些目錄。下圖是指北君電腦實際 gradle 的下載解壓目錄:
我本地使用的是 gradle-6.8.3-bin.zip ,如果你本地網絡沒問題可以自行去官網下載,當然指北君也下載好了,最后也都會給大家。
修改遠程倉庫
改完上面的配置也先別著急運行編譯,現在解決了下載 gradle 慢的問題,但是編譯開始會使用 gradle 從遠程倉庫下載大量相關依賴的包。
如果你采用默認配置,那么我可以負責任的告訴你,你絕對得等呀等呀等,等的黃花菜都涼了。而且還有很大可能會失敗!原因也是因為默認倉庫是國外的服務器,速度真的是沒誰了,想屎,不煩躁都不行。
所以呀,這里我們要把遠程倉庫改為咱們國內的阿里云,這樣就舒服多了,怎么改?
很簡單,找到 Spring 源碼根目錄下的 build.gradle,打開編輯添加阿里云的倉庫。
maven { url 'https://maven.aliyun.com/repository/public' } // 阿里云
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } // 插件
那到這里,就可以運行了?
no!no!no!,hold on, hold on
再打開 Spring 源碼根目錄下的 settings.gradle 文件,添加阿里云倉庫。
maven { url 'https://maven.aliyun.com/repository/public' } //阿里云
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } //插件
至此萬事具備只欠東風了,就等我們開始編譯。
當然上面這些配置優化是指北君在實踐中自己總結出來的,如果你的網速夠快你完全可以不用優化,直接運行下面的命令。
開始編譯構建
我們編譯構建 Spring 源碼,一般都是要導入到 IDEA 里面進行測試或者閱讀的。Spring 對于如何導入也提供了文檔,是不是很貼心。當然也有導入 Eclipse 的文檔,大家可以根據自己的需求來操作。我這里是用 IDEA 的,你如果導入 Eclipse 操作也都是基本上一樣的。
導入 idea 的文檔地址:
https://github.com/spring-projects/spring-framework/blob/main/import-into-idea.md
根據文檔的提示在導入 idea 之前需要去 Precompile spring-oxm ,也就是預編譯 spring-oxm 這個項目。運行 ./gradlew
:spring-oxm:compileTestJAVA.
預編譯起來也很快,我電腦上一共耗時 23 毫秒。
然后我們還要預編譯下 spring-core 這個項目,因為后面我們運行測試模塊的時候需要用到里面的類。執行:
./gradlew :spring-core:compileTestJava.
導入IDEA
- 開始使用idea導入Spring源碼,File -> New -> Project from Existing Souces…
- 選擇 Spring 源碼項目的目錄,進而選擇根目錄當中的 build.gradle 文件導入;
- 導入 idea 之后會開始自動構建、建立索引,這個過程也是很漫長,你只能等,我這邊用了不到7分鐘,看電腦性能;
- 接下來我們對 idea 進行一些設置,不然每次 idea 運行都會通過 gradle 去編譯運行。gradle 運行編譯特別慢,需要改成idea自己編譯運行.
說明一下,這里不是一定要改,但是如果你不改用默認的則會特別慢,改成idea快的不止一點點。
到這,我們的 spring 框架源碼就編譯完了,為了檢驗我們的勞動成果,下面建一個 moudle 來測試一下。
驗證測試
- 在我們的 spring 源碼項目下新建我們自己的測試module,如下圖所示;
輸入測試的 moudle 名:
- 建好項目之后再 gradle 的配置文件中添加 spring 的依賴,相當于你建了一個maven項目,在pom文件中添加spring的依賴;
implementation(project(":spring-context"))
修改后的配置:
- 寫測試代碼;
- 配置類的代碼,用于指定掃描的bean;
package com.sevenluo.spring.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.sevenluo.spring")
public class AppConfig {
//掃描ccom.sevenluo.spring包下面的所有bean
}
- 寫一個sevice,被掃描的bean;
package com.sevenluo.spring.services;
import org.springframework.stereotype.Service;
@Service
public class HelloService {
public void hello() {
System.out.println("Hello,sevenluo!");
}
}
- 測試類代碼;
- 右鍵運行——可能你會出現一些錯誤;比如博主這里就出現了ava: 程序包jdk.jfr不存在 錯誤;
這個問題是因為 jdk.jfr 是 java9 以后才有的模塊,而 spring 源碼 5.3.8 版本已經使用這個包,所以我們需要設置我們項目配置的 jdk 版本高于9。
排查后,是因為 idea 配置的 java 編譯的版本是8,改為11即可。
最后再次運行,就成功了。
總結
今天主要分享了如何編譯 spring-framework 源碼如何編譯構建,以及怎么導入到 IDEA 中,方便我們測試和閱讀。
其中,在編譯前我結合自己的實踐經驗,提出了一些需要優化的配置,極大的提高了編譯構建的速度以及成功率。比如本地下載 gradle,配置阿里云倉庫等。
正如開頭的對話,我希望可以幫助想深入學習Spring,但是卻苦于基礎環境配置搞不太定的小伙伴。






