您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)搭建springboot-2.3.x最新版的方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
一、前言
跟很多小伙伴聊天,發(fā)現(xiàn)一個(gè)嚴(yán)重的問(wèn)題,很多小伙伴橫向發(fā)展的貌似很不錯(cuò),很多技術(shù)都能說(shuō)出一二,但是如果在某個(gè)技術(shù)上深挖一下就不行了,問(wèn)啥啥不會(huì)。就拿springboot來(lái)說(shuō),很多同學(xué)止步于springboot的應(yīng)用,再往深處就一問(wèn)三不知了,那么如何破局呢?smart哥認(rèn)為最好的辦法就是直搗黃龍,要把一個(gè)技術(shù)理解透了,聽別人講一萬(wàn)遍原理,不如自己撕一遍源碼。
要閱讀源碼那就首先得先搭建源碼閱讀環(huán)境,那么本篇文章就來(lái)介紹下Spring Boot的源碼環(huán)境搭建。 鑒于spring團(tuán)隊(duì)已經(jīng)全面拋棄maven構(gòu)建工具而選用gradle來(lái)構(gòu)建,而且網(wǎng)上目前看來(lái)還沒(méi)有文章介紹springboot最新版2.3.x的gradle構(gòu)建(絕大多數(shù)都是maven構(gòu)建),那么本篇文章就是基于gradle來(lái)構(gòu)建最新版springboot2.3.2的源碼閱讀環(huán)境。
二、環(huán)境準(zhǔn)備
1、git
拉取源碼使用
2、jdk8及以上
一般小伙伴機(jī)器上都已經(jīng)裝好了
3、gradle6.5.1
打開 https://services.gradle.org/distributions/ 選擇最新版本:gradle-6.5.1-all.zip(all版本是帶源碼的)
下載解壓后目錄結(jié)構(gòu)如下:
設(shè)置環(huán)境變量:
完成后打開cmd,執(zhí)行
gradle -v
表示已經(jīng)安裝成功,版本為6.5.1
4、idea2020.1.2
(網(wǎng)上很多朋友表示idea2020之前的版本導(dǎo)入時(shí)始終有問(wèn)題,建議升級(jí)到2020.1版本,smart哥當(dāng)前使用的就是2020.1.2版本)
不得不說(shuō)2020.1.2版本真香,之前的版本很多bug都在2020.1中得到修復(fù)。那些個(gè)bug真的會(huì)讓人奔潰。
注意:springboot源碼構(gòu)建、編譯及冒煙測(cè)試會(huì)非常的耗內(nèi)存,建議內(nèi)存不足16g的小伙伴升級(jí)下機(jī)器內(nèi)存,最少16g。
三、下載源碼
從官方倉(cāng)庫(kù) https://github.com/spring-projects/spring-boot Fork
出屬于自己的倉(cāng)庫(kù)。
Fork
?既然開始閱讀、調(diào)試源碼,我們可能會(huì)寫一些注釋,有了自己的倉(cāng)庫(kù),可以進(jìn)行自由的提交。2.3.x
的分支代碼 (2.3.2.BUILD-SNAPSHOT)。Fork
出來(lái)的倉(cāng)庫(kù)拉取代碼,注意這里為什么不拉取master分支呢?因?yàn)閟mart哥剛開始就是拉取的master分支,但是master分支依賴的spring版本為spring-5.3.0-M1版本,該版本非穩(wěn)定版本,而且編譯到最后會(huì)出現(xiàn)問(wèn)題,報(bào)一些spring模塊的5.3.0-M1.jar包不存在或無(wú)法下載等一些莫名其妙的錯(cuò)誤, 所以我這邊拉取的是2.3.x分支,這個(gè)分支依賴的spring版本為5.2.7.RELEASE版本。所以我就git clone 2.3.x分支到本地,然后再導(dǎo)入idea中。
具體過(guò)程如下:
1、打開 https://github.com/spring-projects/spring-boot,點(diǎn)擊右上角Fork即可,這樣就把spring倉(cāng)庫(kù)fork到自己的倉(cāng)庫(kù)中了。
2、選擇一個(gè)目錄,我的是E:\mypro\IdeaProjects\spring-boot-2.3.1,空白處右擊Git Bash Here
執(zhí)行:
git clone -b 2.3.x https://github.com/spring-projects/spring-boot.gi
下載到本地
四、開始構(gòu)建
1、打開idea后,【File】->【Open…】,打開剛拉取的spring-boot源碼,點(diǎn)擊ok即可打開,如下圖:
打開之后,gradle會(huì)自動(dòng)構(gòu)建,開始下載gradle-6.4-bin.zip工具包,idea中還有一些地方需要設(shè)置,所以先不構(gòu)建,點(diǎn)擊取消,如下圖:
取消后如下圖:
2、選擇【File】->【project Structure…】,打開后點(diǎn)擊左側(cè)Project,然后Project SDK選擇java version 1.8,Project language level選擇8,如下圖:
接下來(lái),Modules選擇Project SDK 1.8,點(diǎn)擊ok即可
3、設(shè)置完畢之后,打開工程下的gradle->wrapper下的gradle-wrapper.properties文件,注釋掉:
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-bin.zip
換成本地的gradle-6.5.1-all.zip,這個(gè)版本是當(dāng)前最新版,而且是帶源碼的。
distributionUrl=file:///e:/dev_env/gradle-6.5.1-all.zip
如圖所示:
4、修改工程下的buildSrc下的build.gradle文件,找到如下代碼段,添加阿里云鏡像(不添加的話幾個(gè)小時(shí)也構(gòu)建不完)
repositories { //加上阿里云鏡像 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url "https://repo.spring.io/plugins-release" } mavenCentral() gradlePluginPortal() maven { url "https://repo.spring.io/release" } }
如圖:
5、繼續(xù)修改同目錄下的settings.gradle文件,這是全局配置文件,也要加上阿里云鏡像,找到如下代碼塊,修改如下:
pluginManagement { repositories { //加上阿里云鏡像 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url "https://repo.spring.io/plugins-release" } mavenCentral() gradlePluginPortal() } ...... }
如下圖所示:
6、修改工程根目錄下的build.gradle文件(前面修改的是buildSrc下的,注意區(qū)別),同樣是加上阿里云鏡像,紅框中的代碼需要全部加上,且只能加在該文件頭部。
buildscript { repositories { maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url "https://repo.spring.io/plugins-release" } } }
還是這個(gè)文件,繼續(xù)修改,往下找到如下圖的代碼塊,加上阿里云鏡像
allprojects { group "org.springframework.boot" repositories { //阿里云鏡像 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' } mavenCentral() ...... } ...... }
7、繼續(xù)修改根目錄下的全局配置文件settings.gradle,同樣是加上阿里云鏡像
pluginManagement { repositories { //阿里云鏡像 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' } mavenCentral() ...... } ...... }
如下圖所示:
8、ok,到此才可以開始愉快的構(gòu)建,如下圖,構(gòu)建中。。。
經(jīng)過(guò)一段時(shí)間之后,構(gòu)建快結(jié)束的時(shí)候,執(zhí)行test這一步的時(shí)候,出現(xiàn)問(wèn)題(當(dāng)然這一步可以省略,但是smart哥先天的強(qiáng)迫癥不允許),于是開始破解之法。
這個(gè)問(wèn)題乍一看是無(wú)從入手的,然后往上找到錯(cuò)誤提示:
file:///E:/mypro/IdeaProjects/spring-boot-2.3.1/spring-boot/buildSrc/build/reports/tests/test/classes/org.springframework.boot.build.testing.TestFailuresPluginIntegrationTests.html#multiProjectParallel()
于是拷貝這一段地址在瀏覽器打開,如下圖所示:
是一段測(cè)試報(bào)告
繼續(xù)往下查找,找到問(wèn)題關(guān)鍵所在,heap堆內(nèi)存沒(méi)有足夠的空間,錯(cuò)誤如下:
9、我本機(jī)是16g內(nèi)存,于是修改idea的bin目錄下的idea.exe.vmoptions文件,修改idea的初始化內(nèi)存和最大內(nèi)存參數(shù):
-Xms1024m,-Xmx4096m
修改后的文件內(nèi)容如下:
-server -Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize=500m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -XX:CICompilerCount=2 -Dsun.io.useCanonPrefixCache=false -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Djdk.attach.allowAttachSelf=true -Dkotlinx.coroutines.debug=off -Djdk.module.illegalAccess.silent=true -Dfile.encoding=UTF-8
10、重新編譯還是報(bào)錯(cuò),于是打開【File】->【Settings】,【Build,Execution,Deployment】->【Compiler】,Build process heap size(Mbytes)改成2000
11、重新編譯還是報(bào)錯(cuò),繼續(xù)修改buildSrc目錄下的gradle.properties文件,新增如下配置:
#新增如下配置,解決heap堆內(nèi)存空間不夠問(wèn)題 gradlePropertiesProp=gradlePropertiesValue sysProp=shouldBeOverWrittenBySysProp systemProp.system=systemValue org.gradle.caching=false org.gradle.jvmargs=-Xms2048m -Xmx4096m org.gradle.parallel=true org.gradle.daemon=true org.gradle.configureondemand=true
重點(diǎn)是:org.gradle.jvmargs=-Xms2048m -Xmx4096m
配置完重新構(gòu)建,編譯,最后還是報(bào)空間不足,于是將org.gradle.jvmargs內(nèi)存擴(kuò)大一倍,如下:初始4g,最大8g
修改完再次重新構(gòu)建,編譯,終于成功!!撒花?。?分10秒,時(shí)間還是很快的。
五、源碼測(cè)試
1、在springboot-boot-tests模塊下隨便找一個(gè)spring-boot-smoke-test-hibernate52工程來(lái)進(jìn)行冒煙測(cè)試,打開Hibernate52Application.java文件,直接執(zhí)行main方法啟動(dòng)springboot,成功!
console中出現(xiàn)我們熟悉的圖標(biāo)。
2、下面進(jìn)行單元測(cè)試,還是在spring-boot-smoke-test-hibernate52下的test目錄中,打開Hibernate52ApplicationTests.java文件,在contextLoads()方法中加一段打印信息:
@Test void contextLoads() { System.out.println("hibernate test...."); }
執(zhí)行Run Test,OK,測(cè)試也是沒(méi)有問(wèn)題的,測(cè)試結(jié)果如下圖:
至此,spring-boot的源碼閱讀環(huán)境全部搭建并測(cè)試完畢
六、問(wèn)題及解決方案
1、TestFailuresPluginIntegrationTests > multiProjectParallel() FAILED
java.lang.AssertionError at TestFailuresPluginIntegrationTests.java:88
該問(wèn)題是junit包下載超時(shí),可能是我機(jī)器網(wǎng)絡(luò)抽風(fēng)了,刷新重新構(gòu)建即可!
2、spring-websocket-5.3.0-M1.jar包找不到
如果小伙伴們拉取的是master分支,就像我在本文開頭講的那樣,此時(shí)報(bào)spring-websocket-5.3.0-M1.jar包找不到,提示在下面的地址中查找。
但是 https://maven.aliyun.com/repository/grails-core/org/springframework/spring-websocket/5.3.0-M1/spring-websocket-5.3.0-M1.jar
這個(gè)鏈接明明是可以下載的,所以smart哥一頭霧水,懵圈了很久。
經(jīng)過(guò)smart哥多次刷新重新下還是無(wú)法下載,于是拋棄master分支,轉(zhuǎn)而拉取2.3.x分支。
關(guān)于搭建springboot-2.3.x最新版的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。