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

一、前言

跟很多小伙伴聊天,发现一个严重的问题,很多小伙伴横向发展的貌似很不错,很多技术都能说出一二,但是如果在某个技术上深挖一下就不行了,问啥啥不会。就拿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 ?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。
  • 本文使用的 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.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最新版源码阅读环境搭建(基于gradle构建)的文章就介绍到这了,更多相关springboot源码阅读环境搭建内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot环境搭建及第一个程序运行(小白教程)

    spring boot简介 spring boot框架抛弃了繁琐的xml配置过程,采用大量的默认配置简化我们的开发过程. 所以采用Spring boot可以非常容易和快速地创建基于Spring 框架的应用程序,它让编码变简单了,配置变简单了,部署变简单了,监控变简单了. 说的直白一些使用spring boot之后就不用像以前使用ssm的时候添加那么多配置文件了,spring boot除了支持ssm之外,还支持非常多的第三方技术.spring boot就像是一个百宝箱,你要用那些技术,直接告诉他就

  • Springboot整合Dubbo教程之项目创建和环境搭建

    本文介绍了Springboot整合Dubbo教程之项目创建和环境搭建,分享给大家,具体如下: 1. 使用IDEA新建一个Maven项目 新建项目 选择Maven后,点击next下一步 选择项目类型 配置项目的Maven坐标 设置项目名称和保存位置 修改项目的pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM

  • SpringBoot环境搭建图文教程

    什么是springboot? Spring Boot俗称微服务.Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 1.新建一个maven工程 先选择workspace 点击[next] 直接默认,再点击[ne

  • SpringBoot2整合activiti6环境搭建过程解析

    这篇文章主要介绍了SpringBoot2整合activiti6环境搭建过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </d

  • 简述springboot及springboot cloud环境搭建

    springboot使用特定的方式,简化了spring的各种xml配置文件,并通过maven或者gradle,完成所需依赖,使用springboot maven插件,可直接输出可运行的jar包,省去了tomcat等容器的部署,使得基于http的网络应用开发更加方便快捷. spring中配置文件官方文档http://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/reference/htmlsingle/ springboot基础应用搭建 首先建立mav

  • 浅析SpringBoot及环境搭建过程

    什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. SpringBoot特性 独立运行的Spring项目 Spring Boot可以以jar包的形式来运行,运行一个Spring Boot项目我们只需要通过Java -jar xx.jar类运行.非常方便. 内嵌Servlet容器 Spring Boot可以内嵌Tomcat,这

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

    一.前言 跟很多小伙伴聊天,发现一个严重的问题,很多小伙伴横向发展的貌似很不错,很多技术都能说出一二,但是如果在某个技术上深挖一下就不行了,问啥啥不会.就拿springboot来说,很多同学止步于springboot的应用,再往深处就一问三不知了,那么如何破局呢?smart哥认为最好的办法就是直捣黄龙,要把一个技术理解透了,听别人讲一万遍原理,不如自己撕一遍源码. 要阅读源码那就首先得先搭建源码阅读环境,那么本篇文章就来介绍下Spring Boot的源码环境搭建. 鉴于spring团队已经全面抛

  • 教你使用IDEA搭建spring源码阅读环境的详细步骤

    目录 第一步.准备gradle环境 第二步.下载spring源码 第一步.准备gradle环境 1.去官网下载gradle https://gradle.org/releases/ 2.将其解压缩,创建repository文件夹 和init.d文件夹 创建init.gradle文件 输入文本信息,主要是配置阿里云镜像仓库地址,和maven的类似 gradle.projectsLoaded { rootProject.allprojects { buildscript { repositories

  • 基于Gradle搭建Spring 5.3.13-release源码阅读环境的详细流程

    目录 # 1.安装JDK # 2.安装Gradle # 3.Spring版本命名规则 # 4.下载Spring 5.3.13-release源码 # 5.修改Spring源码中Gradle配置 # 6.构建Spring源码 # 7.导入IDEA 点击File --> New --> Project from Existing Sources... # 8.创建Spring源码debug调试模块 # 基于Gradle搭建Spring 5.5.13-release源码阅读环境 Spring版本:5

  • Eureka源码阅读之环境搭建及工程结构

    目录 1. 源码阅读环境搭建 1.1 源码下载: 2. 工程结构速览 3. 调试须知 1. 源码阅读环境搭建 ide:IntelliJ IDEA 2020.1 包管理:gradle eureka版本:1.10.11 Spring Cloud : 2020.0.2 Spring Boot :2.4.4 1.1 源码下载: 下载完源码之后,需要更改一下几个地方: build.gradle增加阿里云镜像仓库,将如下插件版本改一下,否则导入idea会报错: maven { url 'https://ma

  • SpringBoot+Shiro+LayUI权限管理系统项目源码

    1.项目介绍 本项目旨在打造一个基于RBAC架构模式的通用的.并不复杂但易用的权限管理系统.通过本项目可以较好的理解权限系统的常见业务同时学习掌握Springboot和Shiro等诸多技术点. 2.项目源码 百度网盘链接: 链接: https://pan.baidu.com/s/1GGTe_uf0H7CvMQBP_NCRxg 提取码: 1jwr 3.功能介绍 部门管理 对于一个公司来说,下设众多部门.此处以组织机构树形式动态扩展. 角色管理 包括角色信息的增删改查.权限授予.取消操作. 权限管理

  • springboot bean循环依赖实现以及源码分析

    前言 本文基于springboot版本2.5.1 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.1</version> <relativePath/> <!-- lookup parent from repositor

  • 详解SpringBoot启动代码和自动装配源码分析

    目录 一.SpringBoot启动代码主线分析 二.SpringBoot自动装配原理分析 1.自动装配的前置知识@Import 2.@SpringApplication注解分析 2.1@SpringBootConfiguration 2.2@EnableAutoConfiguration ​随着互联网的快速发展,各种组件层出不穷,需要框架集成的组件越来越多.每一种组件与Spring容器整合需要实现相关代码.SpringMVC框架配置由于太过于繁琐和依赖XML文件:为了方便快速集成第三方组件和减少

  • CloudStack SSVM启动条件源码阅读与问题解决方法

    CloudStack SSVM启动条件源码阅读与问题解决方法: 在CloudStack建立zone的时候,经常遇到SSVM不启动,或者根本就没有SSVM的情况,分析CloudStack日志,会发现有"Zone 1 is not ready to launch secondary storage VM yet"打印,意思是zone还未准备好启动SSVM. 通过查询CloudStack源代码,发现启动SSVM前有如下检查:         获取Zone里的template. select

  • Three.js源码阅读笔记(Object3D类)

    这是Three.js源码阅读笔记的第二篇,直接开始. Core::Object3D Object3D似乎是Three.js框架中最重要的类,相当一部分其他的类都是继承自Object3D类,比如场景类.几何形体类.相机类.光照类等等:他们都是3D空间中的对象,所以称为Object3D类.Object3D构造函数如下: 复制代码 代码如下: THREE.Object3D = function () { THREE.Object3DLibrary.push( this ); this.id = THR

  • Three.js源码阅读笔记(物体是如何组织的)

    这是Three.js源码阅读笔记第三篇.之前两篇主要是关于核心对象的,这些核心对象主要围绕着矢量vector3对象和矩阵matrix4对象展开的,关注的是空间中的单个顶点的位置和变化.这一篇将主要讨论Three.js中的物体是如何组织的:即如何将顶点.表面.材质组合成为一个具体的对象. Object::Mesh 该构造函数构造了一个空间中的物体.之所以叫"网格"是因为,实际上具有体积的物体基本都是建模成为"网格"的. 复制代码 代码如下: THREE.Mesh =

随机推荐