(序)【Spring 源码专题】展开 Spring 源码构建之旅(利用 IDEA 和 Gradle)

环境的搭建
Git
JDK8+ (master 分支需要 JDK 11)
Spring 源码仓库地址(5.2.x 分支):https://github.com/spring-projects/spring-framework
master 分支需要 JDK 11
IDEA
gradle 组件
下载 gradle

如何安装 Gradle 此处省略,留一个传送门:Gradle
配置 gradle
下载下来后解压

配置环境变量
GRADLE_HOME

GRADLE_USER_HOME

验证 gradle

下载源码
clone 源码

修改 spring 源码配置
Spring 源码下载下来后,不着急导入 idea,先修改几处配置

配置 gradle 的远程仓库
import-into-idea.md:这是官方提供的 spring 源码导入 idea 的步骤和注意说明,我已经翻译过了,可以移步:IDEA 导入 Spring 源码调试必看。
打开 spring 源码的 gradle 配置文件

修改 settings.gradle 文件
下载依赖的网络速度之不可描述原因,懂得人都懂,我们加上阿里云的 maven 仓库。

修改 build.gradle 文件
如下两处添加镜像源配置
配置阿里云仓库地址,在 build.gradle 文件的,在 repositories 配置项中添加阿里云仓库地址。

或

修改 gradle.properties 文件
version=X.X.X-SNAPSHOT
设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
org.gradle.jvmargs=-Xmx2048M
开启 Gradle 缓存
org.gradle.caching=true
开启并行编译
org.gradle.parallel=true
启用新的孵化模式
org.gradle.configureondemand=true
开启守护进程 通过开启守护进程,下一次构建的时候,将会连接这个守护进程进行构建,而不是重新 fork 一个 gradle 构建进程
org.gradle.daemon=true
修改好之后如下图所示:

配置源码使用的 gradle 版本

这里的 distributionUrl 的值指向我们下载的 gradle-4.9-all.zip 压缩包
修改 spring-beans.gradle 文件配置

注释掉部分报错配置,替换成新的配置
使用 IDEA 打开
等待 IDEA 加载完成即可。

注:也可以指定 clone 的分支或者先 fork 到自己的仓库,然后再 clone。
执行测试
在项目右键创建 module

选择 Gradle Java

创建 module

在 build.gradle 中添加配置

设置相关配置


例如可以加入 JVM 参数:
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m



创建测试类并测试
其中 UserComponent 添加了 @Component 注解, 程序正常执行则一切 OK。可以开始愉快的调试代码了。

编译 oxm、编译 core
要编译整个 spring 的源码,我们需要预先编译 spring-oxm 和 spring-core,确保 oxm 和 core 模块编译成功后,即可编译 spring 整体
在 gradle 面板中找到如下按钮,点击即可编译 oxm 模块

编译结果如下
我这里因为已经编译过了,所以会比较快

同理,编译 core 模块

编译整个 spring 源码
确保 oxm 和 core 模块编译成功后,即可编译 spring 整体

结果如下:

到这里的话,其实 spring 的编译就完成了。项目的整体结构如下,并且各个模块在 idea 中都有一个蓝色的小标

验证
实践是检验真理的唯一标准,那么怎样验证我们上面的构建是否成功呢,很简单,写个 demo 测试一下就好了,下面进入验证过程。
在 spring-framework-master 项目下新建我们自己的测试 module,如下图所示:

选择使用 gradle
输入自己的 module 名

既然要验证,那我们肯定需要依赖 spring 的模块,我们在我们刚刚新建的模块下 build.gradle 文件中修改使用阿里云仓库,同时依赖 spring-context 等多个基础模块。
修改 spring-自定义模块的 build.gradle 文件,新增依赖

刷新依赖,重新编译,速度同样飞快。

我们先写一个配置类
写一个实体 Bean
编写测试类,运行,如下图所示:

针对于一些出现的问题:可以参考一下:【spring】 spring-5.0.x源码本地编译 (juejin.cn)
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/9c5dfea5cebbd9f41c3e1d282】。文章转载请联系作者。
评论