1.1.1 综述
作为Java程序员, 阅读Spring源码是进阶的必经之路, 现在的Spring采用Gradle进行构建, 速度比Maven快. 不过编译过Spring的朋友都懂, 很少有人能够一次两次就成功编译Spring. 去网上搜索各种教程, 要么版本太老不再适用, 要么就是一堆问题. 今天我将编译当前时间点最新版的Spring源码过程记录下来, 供大家参考
1.1.2 编译前准备
-
JDK: 从Spring Framework 6开始, 编译Spring最低要求JDK17+, 笔者采用的是最新的稳定版JDK21. 已经学习到Spring了, 怎么配置Java环境变量就不再多言
-
Gradle: 6.2.0版本使用的Gradle版本是8.11.1, 大佬可以动手自定义修改, 小白建议按官方的版本走. 建议先在本地解压配置好GRADLE_HOME和GRADLE_USER_HOME, 后续编译时会用到本地的Gradle, 怎么配置网上有很多文章. Gradle的下载地址services.gradle.org/distributio…, 建议大家选择gradle-8.11.1-all.zip, 如果只是选择纯二进制发布包的话, 后续在编译的过程中, 有可能还是会去下载gradle-8.11.1-src.zip的, 这个下载速度也很慢, 因此我们一步到位, 直接先下载好gradle-8.11.1-all.zip
-
IDEA: 建议使用较新的版本, 我使用的是最新的IDEA 2024.3
-
下载Spring Framework源码, 本次使用的是6.2.0版本, 使用git clone到本地, 用IDEA打开, 目录结构如下
1.1.3 修改配置文件
-
修改gradle-wrapper.properties
进入/gradle/wrapper目录, 可以找到gradle-wrapper.properties文件, 默认配置如下. 可以distributionUrl被指定了一个远程地址, 用以下载对应的Gradle版本
由于众所周知的原因, 直接去远程下载Gradle是非常慢的, 甚至无法下载, 因此我们前面下载的Gradle就是为了在此处派上用场. 如果你看到的gradle版本不同于此, 建议以你看到的为准
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists将distributionUrl修改为如下配置, file:/// 标识指定一个本地的文件路径, 后面的路径配置为你本地下载的gradle压缩包路径
distributionUrl=file:///C:/App/dev/gradle-version/gradle-8.11.1-all.zip总体而言配置成这样
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=file:///C:/App/dev/gradle-version/gradle-8.11.1-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
-
修改build.gradle
构建过程中需要下载很多依赖, 由于众所周知的原因, 很多依赖下载很慢, 因此此处换用国内的镜像, 打开根目录的build.gradle文件, 在repositories配置中添加国内的镜像, 本处使用的是阿里云的镜像
maven { url 'https://maven.aliyun.com/repository/public' } -
修改编译的JDK配置
Spring在build时, 指定使用了BellSoft的OpenJDK, 因此在后续的编译过程中, 如果电脑上没有安装BellSoft的OpenJDK, 会自动帮你下载一个, 速度非常慢..., 因此我们最好在build之前就先更换
-
修改JavaConventions.java文件
找到buildSrc/src/main/java/org/springframework/build/JavaConventions.java文件, 可以看到在这个类中声明了一个applyJavaCompileConventions方法, 其中指定了使用BellSoft的JDK
-
选择你想使用的版本
我们可以看出JvmVendorSpec.BELLSOFT这个常量是从gradle中引入的, 查看JvmVendorSpec类的文档, 我们可以看到有如下选择
可以看到这里定义了很多不同的JDK版本, 选择最适合你的版本即可. 笔者使用的是Oracle的OpenJDK, 因此将该处修改为ORACLE
-
1.1.4 编译Spring
-
编译spring-oxm
要编译spring源码, 我们首先需要编译spring-oxm模块, 进入Spring源码路径spring-framework\spring-oxm中, 打开控制台, 输入如下命令开始编译, 第一次编译会非常慢, 可能需要等待一定时间
gradle :spring-oxm:compileTestJava等待一定时间后, 可以看到oxm模块编译成功
-
编译spring-core
同样, 进入spring-framework\spring-core模块中, 执行命令
gradle :spring-core:compileTestJava可以看到编译成功
-
导入Spring项目
点击IDEA右上角Gradle中的Sync all gradle project按钮, 导入gradle项目
等待一段时间导入完成后, 显示build successful, gradle展示Spring各Moudle的列表, 至此, 编译成功