大家在學(xué)習(xí)spring時(shí)源碼總是繞不開的,今天我分享一下我的spring源碼編譯過程,詳細(xì)講解了常見問題的解決辦法。
此過程中要用到的工具及版本:
1.JDK11
2.Spring-framework 5.3.27
3.Gradle7.5.1
4.IDEA 2021.3
文章目錄:
1.下載spring源碼
2.閱讀spring官方編譯文檔
3.修改gradle相關(guān)配置
4.開始編譯構(gòu)建
5.導(dǎo)入IDEA
6.測試驗(yàn)證
7.總結(jié)
1.下載spring源碼
首先從spring官網(wǎng)https://spring.io/下載源碼,spring全家桶包含許多框架,我們選擇今天的主角spring-framework,
?
我們可以看到,目前官網(wǎng)上最新版本是6.0.8,更新速度還是很快的,每個(gè)版本更新的新特性可以適當(dāng)了解一下,生產(chǎn)環(huán)境不建議用最新版本。今天我選擇一個(gè)常用的穩(wěn)定版本5.3.27來編譯測試。
點(diǎn)右上角的github圖標(biāo)進(jìn)入GitHub上的源碼頁面,頁面默認(rèn)為最新版本,若要編譯最新版本直接git clone即可,但是我選擇右邊release,找到我想要的歷史版本5.3.27,選擇zip包下載即可下載源碼。
?
?
?為了方便大家,可以直接點(diǎn)擊此處連接進(jìn)行下載?https://github.com/spring-projects/spring-framework/archive/refs/tags/v5.3.27.zip
2.閱讀spring官方編譯文檔
其實(shí)呀,很多搞不定 Spring 源碼編譯的小伙伴,肯定很多都是去網(wǎng)上隨便找個(gè)教程,結(jié)果各種踩坑,因?yàn)樗训降馁Y料參差不齊,這點(diǎn)估計(jì)大家都深有體會(huì)了。
所以我們就要養(yǎng)成一個(gè)習(xí)慣,必須要看官方文檔。這里也不是要求大家其它資料不看,畢竟也有很多優(yōu)秀的博客,大家都是成年人,肯定是全都要嘍。
官方文檔一般都是英文,但是別害怕,找個(gè)有道翻譯,一下就搞定了。
如何編譯 Spring 源碼其實(shí) Spring 官方提供了詳細(xì)的文檔,有離線版也有在線版,也就是開源項(xiàng)目都有的 REDAME 文件。
我這里選擇離線版來演示吧。我們解壓進(jìn)入到下載好的 Spring 框架源碼項(xiàng)目下,查看 REDAME 。
?用記事本打開會(huì)看到里面有一個(gè)build from source?的連接,對(duì)應(yīng)的就是spring源碼官方編譯文檔了:https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
接下來,咱們就按照文檔來編譯?Spring-Framework5.3.27
?版本的源碼。 根據(jù)文檔的說明,首先我們要有一個(gè)?JDk11
?或者更高的版本環(huán)境
我電腦安裝的是?JDk8,但是會(huì)報(bào)錯(cuò):程序包
jdk.jfr不存在,經(jīng)過排查發(fā)現(xiàn)jdk8的lib中是沒有jfr這個(gè)包的,所以我換了JDK11進(jìn)行編譯。
? 3.修改gradle相關(guān)配置
接下來我們需要修改一堆配置,確保編譯的環(huán)境。
下載gradle
因?yàn)榈谝淮芜\(yùn)行就會(huì)去下載?gradle
?到本地,然后通過?gradle
?來編譯?Spring
?源碼。 這個(gè)就很慢了,外網(wǎng)服務(wù)器下載,你懂得,有被墻的風(fēng)險(xiǎn),并且本身也賊慢。
那為什么開始編譯構(gòu)建就會(huì)自動(dòng)下載?gradle
?呢?從哪里下載?下載的版本是多少?
打開spring源碼包,找到里面一個(gè)叫g(shù)radle的子工程,里面有相關(guān)gradle的配置。
?打開配置文件gradle-wrapper.properties,有如下內(nèi)容:
1 distributionBase=GRADLE_USER_HOME 2 distributionPath=wrapper/dists 3 distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip 4 zipStoreBase=GRADLE_USER_HOME 5 zipStorePath=wrapper/dists
-
distributionUrl:表示的就是 gradle 的下載地址,默認(rèn)配置的是一個(gè)遠(yuǎn)程 URL。
-
distributionBase:下載后存放的目錄,默認(rèn)就是用戶目錄下的?
.gradle
?目錄; -
zipStoreBase:解壓后存放的目錄
我在構(gòu)建的過程中發(fā)現(xiàn)配置的下載地址下載非常慢,經(jīng)常超時(shí),甚至有時(shí)候被墻。所以我們先下載到本地,然后修改配置文件從本地獲取?gradle
,這樣一來編譯構(gòu)建就會(huì)快很多了。
我們只需要修改?gradle
?的下載地址就好了,其他的配置項(xiàng)建議保持不變。
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=file\:///D:/mysoft/Program-files/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
上述配置的意思就是如果我們運(yùn)行 ./gradlew 會(huì)自動(dòng)去?file\:///D:/mysoft/Program-files/gradle-7.5.1-bin.zip?這個(gè)目錄下載一個(gè) gradle 到當(dāng)前用戶的 .gradle\wrapper\dists目錄 ,然后解壓到當(dāng)前用戶的 .gradle\wrapper\dists 目錄。切記:distributionUrl這個(gè)本地路徑中不能有空格,否則會(huì)報(bào)錯(cuò)的?
?
?
? 改完上面的配置后,我們修改gradle倉庫的配置。與maven類似,gralde下載依賴包默認(rèn)是從國外倉庫下載的,那就會(huì)超級(jí)慢,我們要把倉庫地址改為國內(nèi)的阿里云倉庫,提高編譯速度。
? 找到spring源碼根目錄下的build.gradle,添加阿里云倉庫地址
?
1 maven { url 'https://maven.aliyun.com/repository/public' } //阿里云
?
第二步,找到spring源碼根目錄下的settings.gradle,添加阿里云倉庫
第三步(可以不配置),gradle下載依賴的位置。
gradle默認(rèn)下載依賴的位置是根據(jù)環(huán)境變量GRADLE_USER_HOME決定,默認(rèn)是在C:\Users\用戶名\.gradle\caches\modules-2\files-2.1? 路徑中,因?yàn)橹耙恢庇玫膍aven庫,這里我們配置環(huán)境變量GRADLE_USER_HOME也指向maven本地倉庫的地址。
?
4.開始構(gòu)建編譯
我們編譯構(gòu)建 Spring 源碼,一般都是要導(dǎo)入到 IDEA 里面進(jìn)行測試或者閱讀的。Spring 對(duì)于如何導(dǎo)入也提供了文檔,是不是很貼心。當(dāng)然也有導(dǎo)入 Eclipse 的文檔,大家可以根據(jù)自己的需求來操作。我這里是用 IDEA 的,你如果導(dǎo)入 Eclipse 操作也都是基本上一樣的。
打開spring源碼根目錄,查看import-into-idea.md文件,當(dāng)然如果要導(dǎo)入eclipse也有import-into-eclipse.md文件。
?根據(jù)提示文檔,在導(dǎo)入idea之前要提前先編譯spring-oxm、spring-core這兩個(gè)模塊
在spring源碼根目錄打開一個(gè)cmd命令窗口,執(zhí)行以下命令進(jìn)行編譯,如果cmd命令遇到:'.' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序? 這個(gè)錯(cuò)誤時(shí),說明gradle環(huán)境沒有配置好,可以配置下gradle環(huán)境變量,或者直接打開一個(gè)powershell窗口進(jìn)行編譯即可。
1 ./gradlew :spring-oxm:compileTestJava
編譯之后發(fā)現(xiàn)報(bào)錯(cuò):
? 這個(gè)問題就是上面說的JDK版本問題,我本地用的jdk8,但是jdk8沒有jfr這個(gè)包,我們升級(jí)jdk11就可以了,接著編譯:
?第一次預(yù)編譯應(yīng)該會(huì)很慢,gradle需要下載依賴包,只需要耐心等待即可。
接下來編譯第二個(gè)模塊,spring-core,執(zhí)行以下命令,可以看到編譯成功。
1 ./gradlew :spring-core:compileTestJava
?5.導(dǎo)入IDEA
打開IDEA,左上角依次點(diǎn)擊:File->New->Project from Existing Sources
?選擇源碼的根目錄:
?選擇編譯工具為gradle
?點(diǎn)擊完成之后,就打開了項(xiàng)目,第一次打開會(huì)進(jìn)行編譯下載依賴包,需要等一會(huì)兒,具體時(shí)間長短要看電腦性能,
過了一會(huì)兒發(fā)現(xiàn)我的編譯報(bào)錯(cuò)了,
?如果出現(xiàn)這個(gè)錯(cuò)誤的話,基本上就是IDEA與gradle的版本不一致問題,在網(wǎng)上搜的話都會(huì)讓你修改gradle各種配置,但即使修改好了,也會(huì)出現(xiàn)另外的問題,聽我的,一定直接升級(jí)IDEA版本,我之前用的是2019.2,版本缺失有點(diǎn)老了,升級(jí)到了2021.3,問題立馬就解決了,而且新版本的IDEA比老版本性能也提升不少,該升級(jí)就升級(jí)。
升級(jí)完版本之后繼續(xù)編譯會(huì)看到下面的編譯成功信息:
?接下來,我們對(duì)IDEA進(jìn)行一些配置,改成使用我們本地的gralde和本地的maven倉庫,這樣編譯會(huì)更快,
?至此,IDEA編譯spring源碼就算大功告成了。
6.驗(yàn)證測試
?編譯成功了之后,我們新建一個(gè)模塊,用來寫自己的一些代碼。
1.在IDEA中新建module,
?
?輸入我們的模塊名稱,點(diǎn)擊Finish即可。
?2.創(chuàng)建好模塊之后,我們需要對(duì)gradle進(jìn)行一下配置,添加spring依賴,就像是在maven的pom文件里添加依賴一樣
1 implementation(project(":spring-context"))
2 implementation(project(":spring-core"))
如下圖:
?3.編寫測試類代碼
編寫配置類代碼,指定spring掃描bean的路徑
1 package com.test; 2 3 import org.springframework.context.annotation.ComponentScan; 4 import org.springframework.context.annotation.Configuration; 5 6 @ComponentScan("com.test") 7 @Configuration 8 public class AppConfig { //掃描com.test下的所有bean 9 }
編寫一個(gè)service,可以被掃描到
1 package com.test; 2 3 import org.springframework.stereotype.Service; 4 5 @Service 6 public class TestService { 7 8 public void helloWorld(){ 9 System.out.println("Hello World"); 10 } 11 12 }
最后獲取到這個(gè)bean,并調(diào)用bean的方法
1 package com.test; 2 3 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 4 5 public class Atest { 6 7 public static void main(String[] args) { 8 9 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 11 12 TestService testService = (TestService)context.getBean("testService"); 13 testService.helloWorld(); 14 } 15 16 }
?運(yùn)行我們的測試方法,輸出以下結(jié)果:
? 這就是測試的service中helloworld()方法輸出的內(nèi)容,說明我們的soring已經(jīng)配置好了可以使用了。
如果在運(yùn)行時(shí)出現(xiàn)以下異常報(bào)錯(cuò),說明我們的jdk版本過低,需要將IDEA中編譯環(huán)境設(shè)置的高一點(diǎn)。
?修改如下的配置,將IDEA的jdk版本還有編譯級(jí)別都設(shè)置的高于java8 ,我這里用的是jdk11,所以設(shè)置成11。
?
?
?最后,也是最重要的一步,將setting中的編譯級(jí)別改為11,就可以成功執(zhí)行了。
?7.總結(jié)文章來源:http://www.zghlxwxcb.cn/news/detail-419395.html
? 至此,整個(gè)spring源碼編譯過程已經(jīng)完成。每個(gè)版本的spring源碼對(duì)應(yīng)的編譯過程,都會(huì)出現(xiàn)各種各樣的問題,大家只要按照官方文檔、多搜搜資料就可以順利解決問題了,如果大家編譯過程中有什么問題,歡迎留言進(jìn)行探討。希望此文對(duì)大家學(xué)習(xí)sprig有所幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-419395.html
到了這里,關(guān)于IDEA編譯Spring源碼教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!