springboot-2.3.x最新版源码阅读环境搭建-基于gradle构建(全网首发)

2023-11-04

springboot-2.3.x最新版源码阅读环境搭建-基于gradle构建(全网首发)


码炫课堂技术交流q群:963060292

一、前言

跟很多小伙伴聊天,发现一个严重的问题,很多小伙伴横向发展的貌似很不错,很多技术都能说出一二,但是如果在某个技术上深挖一下就不行了,问啥啥不会。就拿springboot来说,很多同学止步于springboot的应用,再往深处就一问三不知了,那么如何破局呢?smart哥认为最好的办法就是直捣黄龙,要把一个技术理解透了,听别人讲一万遍原理,不如自己撕一遍源码。

要阅读源码那就首先得先搭建源码阅读环境,那么本篇文章就来介绍下Spring Boot的源码环境搭建。 鉴于spring团队已经全面抛弃maven构建工具而选用gradle来构建,而且网上目前看来还没有文章介绍springboot最新版2.3.x的gradle构建(绝大多数都是maven构建),那么本篇文章就是基于gradle来构建最新版springboot2.3.2的源码阅读环境。

二、环境准备

1、git

拉取源码使用

2、jdk8及以上

一般小伙伴机器上都已经装好了
image-20200707211846249.png
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版本)

网上很多破解版已经失效,如果想要IDEA2020.1.2的小伙伴可以加下码炫课堂技术交流q群:963060292 ,找smart哥获取。

不得不说2020.1.2版本真香,之前的版本很多bug都在2020.1中得到修复。那些个bug真的会让人奔溃。

注意:springboot源码构建、编译及冒烟测试会非常的耗内存,建议内存不足16g的小伙伴升级下机器内存,最少16g。

三、下载源码

从官方仓库 https://github.com/spring-projects/spring-boot Fork 出属于自己的仓库。

  • 为什么要 Fork ?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。

  • 本文使用的 Springboot 版本为最新的 2.3.x的分支代码 (2.3.2.BUILD-SNAPSHOT)。

  • 使用 git 从 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.git

下载到本地
在这里插入图片描述

四、开始构建

1、打开idea后,【File】->【Open…】,打开刚拉取的spring-boot源码,点击ok即可打开,如下图:
在这里插入图片描述

打开之后,gradle会自动构建,开始下载gradle-6.4-bin.zip工具包,idea中还有一些地方需要设置,所以先不构建,点击取消,如下图:
image-20200708172146097.png
取消后如下图:
在这里插入图片描述

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的源码阅读环境全部搭建并测试完毕,各位小伙伴如果在搭建过程中遇到问题可以加

码炫课堂技术交流q群:963060292

找smart哥进行探讨!

六、问题及解决方案

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分支。
在这里插入图片描述

结语

smart哥首创3位1体学习法之–源码篇-最新【spring-boot-2.3.x源码解析】课程即将开启,全盘解析

spring-boot-2.3.x的底层源码。

该课程对群内的小伙伴限时免费开放,具体开课时间以群公告为准!

额~~群在哪??

码炫课堂java技术交流Q群:963060292

速来学习,机不可失,时不再来!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot-2.3.x最新版源码阅读环境搭建-基于gradle构建(全网首发) 的相关文章

  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 对对象集合进行排序[重复]

    这个问题在这里已经有答案了 如果我有一个简单的字符串列表 List
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • JERSEY:错误跟踪:java.lang.IllegalStateException:实体输入流已关闭

    我正在使用 Jersey 2 x 以下是我的控制器 GET Path id Produces application json public Response getUser PathParam id int userId Context
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • 接口是否像对象一样对待?

    为什么下面的代码可以工作 interface I class A implements I public String toString return in a class B extends A public String toStrin
  • 如何在 spring-data 中强制使用 CrudRepository 进行预加载?

    我有一个实体 其中包含List就是这样lazy默认加载 interface MyEntityRepository extends CrudRepository
  • 获取 Future 对象的进度的能力

    参考 java util concurrent 包和 Future 接口 我注意到 除非我弄错了 只有 SwingWorker 实现类才能启动冗长的任务并能够查询进度 这就引出了以下问题 有没有办法在非 GUI 非 Swing 应用程序 映
  • 使用 Swagger 的 Spring REST API 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以帮助我生成 RESTful API 文档的工具 我的服务器是用Java编写的并使用S
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • Android ClassNotFoundException:在路径上找不到类

    10 22 15 29 40 897 E AndroidRuntime 2561 FATAL EXCEPTION main 10 22 15 29 40 897 E AndroidRuntime 2561 java lang Runtime

随机推荐

  • 信贷风控中Vintage、滚动率、迁移率的理解

    风控业务背景 信贷风险管理是一门艺术 更是一门科学 资产质量分析中常会涉及到三个理论 账龄分析 Vintage Analysis 用以分析账户成熟期 变化规律等 滚动率分析 Roll Rate Analysis 用以定义账户好坏程度 迁移率
  • 未解决,fsmgmt.msc共享文件夹管理中,文件夹无属性选项

    之前用的win10家庭版 都没有fsmgmt msc 现在升级成专业版发现没有属性 https jingyan baidu com article 358570f69e9b13ce4724fce9 html 我的电脑
  • windows下redis设置redis开机自启动方法

    1 查看一下Redis服务是否注册 1 Win R快捷键输入services msc 然后回车或者点击确定 2 win10桌面 此电脑 右键单击 管理 gt 服务与应用程序 gt 服务 此处输入R 即可看到R开头的服务列表 在没有添加服务的
  • IDEA+Springboot+Git+jenkins+tomcat实现自动部署-基本流程

    jenkins构建 前言 测试项目准备 一 jenkins构建一个新项目 把Gitee仓库的项目获取到本地打包运行 二 jenkins构建一个新项目 把Gitee仓库的项目获取到本地打包 通过Publish Over SSH传输到另外一台机
  • 《在IDEA中配置MySQL的驱动程序》

    一 下载mysql connecter 下载地址 http dev mysql com downloads connector j 具体步骤已在下图中标注 注意是下载zip压缩包格式 因为解压缩安装很方便 下载完成后得到压缩包如下 二 安装
  • 深度详解ResNet到底在解决一个什么问题?

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 https www zhihu com question 64494691 本文仅作为学术分享 如果侵权 会删文处理 最近看到不少ResNet的变体 比如ResNeSt
  • 【软考】-高项-整合管理-重要知识点思维导图

    整合管理 文章目录 整合管理 含义 内容 项目管理计划 含义 组件 开工 会议 分类 目的作用 如何召开高效会议 批准的变更请求 可交付成果 工作绩效数据 变更的流程 1 提出与记录变更申请 2 初审变更 初审目的 常见方式为变更申请文档的
  • 实例分割模型Mask R-CNN详解:从R-CNN,Fast R-CNN,Faster R-CNN再到Mask R-CNN

    Mask R CNN是ICCV 2017的best paper 彰显了机器学习计算机视觉领域在2017年的最新成果 在机器学习2017年的最新发展中 单任务的网络结构已经逐渐不再引人瞩目 取而代之的是集成 复杂 一石多鸟的多任务网络模型 M
  • React黑马视频自学笔记02

    14 react事件处理 14 1事件绑定 语法 on 事件名称 事件处理程序 比如 onClick gt 注意 React事件采用驼峰命名法 比如 onMouseEnter onFocus 函数组件绑定事件的时候不用this 14 2事件
  • 监控Oracle(oracledb_exporter)

    我们以监控Oracle为例 目前仅有x86版本 可以下载源码针对不同环境使用golang环境自己编译 监控什么指标下载对应系统的exporter插件 统一下载地址 https prometheus io download 监控指标对应的gr
  • 解决实际问题的ES6代码段

    1 如何隐藏所有指定元素 const hide el gt el forEach e gt e style display none Example hide document querySelectorAll img 隐藏页面上的所有 元
  • Ubuntu搭建Qt环境

    1 ubuntu搭建qt环境的好处 ubuntu上可以安装qtcrater 然后一键下载到板子上 不需要手动编译 2 安装linux版本的qtcreater 注意 必须要先安装g 再安装qtcreater 否则会出问题 下载g 编译器 su
  • html实现文字滚动

    要在HTML中实现文字滚动 您可以使用
  • Python实现串口通信(pyserial)

    Python实现串口通信 pyserial pyserial模块封装了对串口的访问 兼容各种平台 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser serial Serial com
  • MySQL数据同步ES的4种方法,你能想到几种?

    大家好 我是老三 这期给大家分享一个电商中常见的场景 MySQL数据同步Elasticsearch 大家应该都在各种电商网站检索过商品 那么检索商品一般都是通过什么实现呢 搜索引擎Elasticsearch 那么问题来了 商品上架 数据一般
  • python爬虫系列1--方案概述

    爬虫技能树 爬虫进阶必须 http www yeayee com article 6569383 1 html 0 requests 模块 beautifulsoup模块 css选择器语法 re正则模块 http头编写 cookies js
  • Ansible自动化运维_超详细

    Ansible自动化运维 自动化运维工具简介 Puppet 自动运维工具特点 Saltstack 自动运维工具特点 Ansible 自动运维工具特点 Ansible 运维工具原理 Ansible 管理工具安装配置 Ansible 工具参数详
  • FastJson解析继承/解析多态/反序列化去解析json

    我这个是在和外围系统调用时用到的 所以我不可能让他们去改返回的报文内容 也就是有的方法里说用SerializerFeature WriteClassName 定义一个interface或者class 其实都一样 public interfa
  • vi 编辑器总结

    创建文件 vi 一 进入vi的命令 vi filename 打开或新建文件 并将光标置于第一行首 vi n filename 打开文件 并将光标置于第n行首 vi filename 打开文件 并将光标置于最后一行首 vi pattern f
  • springboot-2.3.x最新版源码阅读环境搭建-基于gradle构建(全网首发)

    springboot 2 3 x最新版源码阅读环境搭建 基于gradle构建 全网首发 文章目录 springboot 2 3 x最新版源码阅读环境搭建 基于gradle构建 全网首发 一 前言 二 环境准备 三 下载源码 四 开始构建 五