您好,登录后才能下订单哦!
这篇文章将为大家详细讲解有关搭建springboot-2.3.x最新版的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、前言
跟很多小伙伴聊天,发现一个严重的问题,很多小伙伴横向发展的貌似很不错,很多技术都能说出一二,但是如果在某个技术上深挖一下就不行了,问啥啥不会。就拿springboot来说,很多同学止步于springboot的应用,再往深处就一问三不知了,那么如何破局呢?smart哥认为最好的办法就是直捣黄龙,要把一个技术理解透了,听别人讲一万遍原理,不如自己撕一遍源码。
要阅读源码那就首先得先搭建源码阅读环境,那么本篇文章就来介绍下Spring Boot的源码环境搭建。 鉴于spring团队已经全面抛弃maven构建工具而选用gradle来构建,而且网上目前看来还没有文章介绍springboot最新版2.3.x的gradle构建(绝大多数都是maven构建),那么本篇文章就是基于gradle来构建最新版springboot2.3.2的源码阅读环境。
二、环境准备
1、git
拉取源码使用
2、jdk8及以上
一般小伙伴机器上都已经装好了
3、gradle6.5.1
打开 https://services.gradle.org/distributions/ 选择最新版本:gradle-6.5.1-all.zip(all版本是带源码的)
下载解压后目录结构如下:
设置环境变量:
完成后打开cmd,执行
gradle -v
表示已经安装成功,版本为6.5.1
4、idea2020.1.2
(网上很多朋友表示idea2020之前的版本导入时始终有问题,建议升级到2020.1版本,smart哥当前使用的就是2020.1.2版本)
不得不说2020.1.2版本真香,之前的版本很多bug都在2020.1中得到修复。那些个bug真的会让人奔溃。
注意:springboot源码构建、编译及冒烟测试会非常的耗内存,建议内存不足16g的小伙伴升级下机器内存,最少16g。
三、下载源码
从官方仓库 https://github.com/spring-projects/spring-boot Fork
出属于自己的仓库。
Fork
?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。2.3.x
的分支代码 (2.3.2.BUILD-SNAPSHOT)。Fork
出来的仓库拉取代码,注意这里为什么不拉取master分支呢?因为smart哥刚开始就是拉取的master分支,但是master分支依赖的spring版本为spring-5.3.0-M1版本,该版本非稳定版本,而且编译到最后会出现问题,报一些spring模块的5.3.0-M1.jar包不存在或无法下载等一些莫名其妙的错误, 所以我这边拉取的是2.3.x分支,这个分支依赖的spring版本为5.2.7.RELEASE版本。所以我就git clone 2.3.x分支到本地,然后再导入idea中。
具体过程如下:
1、打开 https://github.com/spring-projects/spring-boot,点击右上角Fork即可,这样就把spring仓库fork到自己的仓库中了。
2、选择一个目录,我的是E:\mypro\IdeaProjects\spring-boot-2.3.1,空白处右击Git Bash Here
执行:
git clone -b 2.3.x https://github.com/spring-projects/spring-boot.gi
下载到本地
四、开始构建
1、打开idea后,【File】->【Open…】,打开刚拉取的spring-boot源码,点击ok即可打开,如下图:
打开之后,gradle会自动构建,开始下载gradle-6.4-bin.zip工具包,idea中还有一些地方需要设置,所以先不构建,点击取消,如下图:
取消后如下图:
2、选择【File】->【project Structure…】,打开后点击左侧Project,然后Project SDK选择java version 1.8,Project language level选择8,如下图:
接下来,Modules选择Project SDK 1.8,点击ok即可
3、设置完毕之后,打开工程下的gradle->wrapper下的gradle-wrapper.properties文件,注释掉:
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-bin.zip
换成本地的gradle-6.5.1-all.zip,这个版本是当前最新版,而且是带源码的。
distributionUrl=file:///e:/dev_env/gradle-6.5.1-all.zip
如图所示:
4、修改工程下的buildSrc下的build.gradle文件,找到如下代码段,添加阿里云镜像(不添加的话几个小时也构建不完)
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、继续修改同目录下的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下的,注意区别),同样是加上阿里云镜像,红框中的代码需要全部加上,且只能加在该文件头部。
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" } } }
还是这个文件,继续修改,往下找到如下图的代码块,加上阿里云镜像
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、继续修改根目录下的全局配置文件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,到此才可以开始愉快的构建,如下图,构建中。。。
经过一段时间之后,构建快结束的时候,执行test这一步的时候,出现问题(当然这一步可以省略,但是smart哥先天的强迫症不允许),于是开始破解之法。
这个问题乍一看是无从入手的,然后往上找到错误提示:
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()
于是拷贝这一段地址在浏览器打开,如下图所示:
是一段测试报告
继续往下查找,找到问题关键所在,heap堆内存没有足够的空间,错误如下:
9、我本机是16g内存,于是修改idea的bin目录下的idea.exe.vmoptions文件,修改idea的初始化内存和最大内存参数:
-Xms1024m,-Xmx4096m
修改后的文件内容如下:
-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、重新编译还是报错,于是打开【File】->【Settings】,【Build,Execution,Deployment】->【Compiler】,Build process heap size(Mbytes)改成2000
11、重新编译还是报错,继续修改buildSrc目录下的gradle.properties文件,新增如下配置:
#新增如下配置,解决heap堆内存空间不够问题 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
重点是:org.gradle.jvmargs=-Xms2048m -Xmx4096m
配置完重新构建,编译,最后还是报空间不足,于是将org.gradle.jvmargs内存扩大一倍,如下:初始4g,最大8g
修改完再次重新构建,编译,终于成功!!撒花!!7分10秒,时间还是很快的。
五、源码测试
1、在springboot-boot-tests模块下随便找一个spring-boot-smoke-test-hibernate52工程来进行冒烟测试,打开Hibernate52Application.java文件,直接执行main方法启动springboot,成功!
console中出现我们熟悉的图标。
2、下面进行单元测试,还是在spring-boot-smoke-test-hibernate52下的test目录中,打开Hibernate52ApplicationTests.java文件,在contextLoads()方法中加一段打印信息:
@Test void contextLoads() { System.out.println("hibernate test...."); }
执行Run Test,OK,测试也是没有问题的,测试结果如下图:
至此,spring-boot的源码阅读环境全部搭建并测试完毕
六、问题及解决方案
1、TestFailuresPluginIntegrationTests > multiProjectParallel() FAILED
java.lang.AssertionError at TestFailuresPluginIntegrationTests.java:88
该问题是junit包下载超时,可能是我机器网络抽风了,刷新重新构建即可!
2、spring-websocket-5.3.0-M1.jar包找不到
如果小伙伴们拉取的是master分支,就像我在本文开头讲的那样,此时报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
这个链接明明是可以下载的,所以smart哥一头雾水,懵圈了很久。
经过smart哥多次刷新重新下还是无法下载,于是抛弃master分支,转而拉取2.3.x分支。
关于搭建springboot-2.3.x最新版的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。