1.版本选择
1)源码版本:spring5.3.x
2)gradle版本:根据spring源码的工程路径:gradle/wrapper/gradle-wrapper.properties文件查看gradle版本。如图所示:
可以看到源码版本对应gradle版本为,所以可依此下载gradle-7.2版本,注意这里请保留gradle-7.2的zip压缩包,后面会用到
3)JDK版本:可以根据如下路径中的ide.gradle选择JDK版本,这里是JDK1.8
4)IDEA版本:尽量选择较高版本:我用的是2021.3.2版本
2.环境准备
1)gradle安装并配置环境变量,此步骤可自行百度
2)ieda配置gradle的存储jar包仓库,如图所示:
进入idea的全局设置,可以先打开一个工程,然后再file选项下选择close project 关闭工程可回到此界面
在这里配置gradle仓库路径,用来存储gradle编译spring源码时下载的各种jar包
3)spring源码工程构建前相关文件修改配置
1.maven仓库下载路径修改:因为github下载的源码中maven仓库路径是国外地址,此处可更改为阿里云仓库,gradle编译时下载jar包速度会极大提升
文件路径: spring-framework/build.gradle
在build.gradle文件中找到repositories 代码块,配置如下路径,或者可以自行登录 【阿里云maven仓库地址:https://developer.aliyun.com/mvn/guide】选择url路径配置
repositories { maven { url "https://maven.aliyun.com/repository/public" } maven { url "https://maven.aliyun.com/repository/apache-snapshots" } maven { url "https://maven.aliyun.com/repository/gradle-plugin" } maven { url "https://repo.springsource.org/plugins-release" }//国外路径 maven { url "https://repo.spring.io/libs-spring-framework-build" }//原始路径 mavenCentral() }
2.gradle/wrapper/gradle-wrapper.properties文件修改
默认文件配置如图所示,当我们将项目导入idea时会根据标红地址下载gradle-7.2-bin.zip压缩包,由于前面我们自行下载并配置了gradle,不需要重新下载
修改为如下路径:即存放 gradle-7.2-bin.zip文件的路径
distributionUrl=file\:///D:/Java/gradle-7.2/gradle-7.2-bin.zip
3.spring源码导入ieda
1)直接选择open打开工程
2)此时idea会为源码项目创建工作空间,等待创建完成后会立即开始构建项目,我们不要着急构建项目,还需要在IDEA中为spring源码项目配置gradle和JDK,点击停止按钮打断构建,如下所示
3)给项目配置gradle和jdk
配置如下图:先配置图一再配置图二,
file->project Structure->project
file->settings->gradle
点击确认后,项目就会开始自动build,此时无需其他操作。
4.开始构建
1)当所有模块build完成后,提示finished表示成功
如下的报错信息可以忽略,这个是与git相关的报错信息,不影响spring源码编译
2)为确保所有模块都构建成功,这里可以参考官方spring源码工程中的 import-into-idea.md文档描述:先编译spring-oxm模块
在gradle中使用spring-oxm的 compileTestJava选项编译此模块(双击运行即可),具体位置如图
3)此时再选择spring下的build选项编译整个源码项目
4)编译过程中出现spring-web模块编译失败。如下
注意报错的类和报错行:Jackson2JsonEncoderTests.java 的253行,找到这个类,将253行注释掉,如下:
为什么要注释掉:随意测试出来的,看过这个 jacksonValueUnwrappedBeforeObjectMapperSelection()方法的提交记录 是由spring团队2022.3.16提交的,注释掉不知道是否会影响spring-web模块的引用。
5)重新build ,即重复 3)步骤,编译成功
至此,spring源码编译就成功了
5.新建模块用于测试
此步骤省略不写,主要记录几个踩过的坑
1.gradle7版本和gradle5版本之间用重大升级更新 旧版本的compile关键字在新版本中已经弃用 ,换为 implementation关键字,引用项目时需要注意
2.新建模块并且已经引入了其他模块,编码测试时发现引入项目没生效
此时应该要检查自己gradle编译工具的新建模块下的runtimeClasspath下有没有自己引入的模块,没有就说明引用没成功
解决办法:
先将新建模块下的测试代码(引用其他项目中类的代码)注释掉,再重新build整个spring项目,就可以引用成功了
6.spring源码项目的拉取的技巧分享
step1:先登录自己的github账号,将spring-framework 项目fork到自己的github仓库,复制fork到自己的spring源码仓库的url
step2:登录自己的gitee的账号,选择从github导入仓库
将url填写到如下位置,点击导入即可将源码项目复制到自己的gitee中,从本地拉取速度会相当快,也可以提交自己测试代码用于总结学习