本文内容:
拉取springframework 6.2.x源码
JDK21准备
安装Gradle
修改Spring源码中的gradle配置
编译源码
导入IDEA
创建自定义模块
参考文章
拉取源码
这里我拉取的是6.2.x分支的源码,具体操作如下:
# 拉取主分支代码
git clone https://github.com/spring-projects/spring-framework.git
# 查询分支
git branch -r | grep 6.2
# 输出 origin/6.2.x 则代表 6.2.x分支存在
# 切换分支
git checkout 6.2.x
# 再拉取下,确保代码最新
git pull
# 查看本地分支
git branch
# 显示 6.2.x 和 main 并且指向 6.2.x即可JDK21环境准备
springframework 6.2.x 官方有说,最低要求JDK17,但实际上有些模块编译会依赖JDK21,这里我用的是JDK21。
但是你不一定要把JAVA_HOME配置成JDK21的,我这里还是配置的JDK17。
java -version
java version "17.0.4.1" 2022-08-18 LTS
Java(TM) SE Runtime Environment (build 17.0.4.1+1-LTS-2)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.4.1+1-LTS-2, mixed mode, sharing)重点是要将spring源码下载的gradle.properties的java路径写对:
version=6.2.11-SNAPSHOT
org.gradle.java.home=D:\\develop\\java\\jdk-21.0.4
# org.gradle.java.installations.auto-download=false
org.gradle.caching=true
org.gradle.jvmargs=-Xmx2048m
org.gradle.parallel=true
kotlinVersion=1.9.25
kotlin.jvm.target.validation.mode=ignore
kotlin.stdlib.default.dependency=false
安装Gradle
Gradle的版本我是参考的拉取源码中gradle-wrapper.properties里面指定的版本 8.14.3。
下载链接:https://gradle.org/next-steps/?version=8.14.3&format=bin
# 配置环境变量
GRADLE_HOME = D:\develop\gradle-8.14.3
path = %GRADLE_HOME%\bin
# 验证
gradle -v注意:这里我没有使用gradle-wrapper,按道理应该用gradle-wrapper的,官方推荐!
设置环境变量(重要)
为了让下载的所有依赖到指定目录,方便后续拷贝完整的依赖直接使用,同时避免全部下载到C盘,建议添加以下环境变量。
GRADLE_USER_HOME = D:/develop/gradle-8.14.3/repository这里我为了后续方便直接压缩整个目录,直接放到Gradle的安装根目录中的repository目录
修改Spring源码中的gradle配置
修改build.gradle文件,在repositories中第一行增加:
// 增加阿里云镜像地址
maven { url "https://maven.aliyun.com/repository/public" }这个配置也很重要,能有效避免下载插件失败问题
解决JDK toolChain的问题(有坑)
在gradle.properties中指定自己的JDK:
version=6.2.11-SNAPSHOT
org.gradle.java.home=D:\\develop\\java\\jdk-17.0.4.1
# org.gradle.java.installations.auto-download=false
org.gradle.caching=true
org.gradle.jvmargs=-Xmx2048m
org.gradle.parallel=true
kotlinVersion=1.9.25
kotlin.jvm.target.validation.mode=ignore
kotlin.stdlib.default.dependency=false这里我是先用的JDK17,但是后面导入IDEA编译的时候会要求JDK21,后面再改成JDK21的路径也可以。
修改setting.gradle:
// 增加 apply false,或者直接干掉
id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" apply false修改编译的Java文件(重点):
在 spring-framework/buildSrc/src/main/java/org/springframework/build/JavaConventions.java 文件第 89 行,有如下硬编码代码:
toolchain.getVendor().set(JvmVendorSpec.BELLSOFT);注释掉上面这一行,不然编译的时候会一直去下载ToolChain!!!
增加插件仓库(重点)
修改整个setting.gradle文件,一定要注意顺序:
// ===================================================================================================================
// 必须放最前
pluginManagement {
repositories {
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url "https://maven.aliyun.com/repository/public" }
gradlePluginPortal()
mavenCentral()
}
}
// 其次是 plugins
plugins {
id "com.gradle.develocity" version "3.19"
id "io.spring.ge.conventions" version "0.0.17"
id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" apply false
}
// plugins 之后才能写 dependencyResolutionManagement
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
repositories {
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/spring" }
mavenCentral()
}
}
// =================================================================================================================
// 下面的是原本就有的,不需要动
include "spring-aop"
include "spring-aspects"
include "spring-beans"
include "spring-context"
include "spring-context-indexer"
include "spring-context-support"
include "spring-core"
include "spring-core-test"
include "spring-expression"
include "spring-instrument"
include "spring-jcl"
include "spring-jdbc"
include "spring-jms"
include "spring-messaging"
include "spring-orm"
include "spring-oxm"
include "spring-r2dbc"
include "spring-test"
include "spring-tx"
include "spring-web"
include "spring-webflux"
include "spring-webmvc"
include "spring-websocket"
include "framework-api"
include "framework-bom"
include "framework-docs"
include "framework-platform"
include "integration-tests"
rootProject.name = "spring"
rootProject.children.each {project ->
project.buildFileName = "${project.name}.gradle"
}
settings.gradle.projectsLoaded {
develocity {
buildScan {
File buildDir = settings.gradle.rootProject
.getLayout().getBuildDirectory().getAsFile().get()
buildDir.mkdirs()
new File(buildDir, "build-scan-uri.txt").text = "(build scan not generated)"
buildScanPublished { scan ->
if (buildDir.exists()) {
new File(buildDir, "build-scan-uri.txt").text = "${scan.buildScanUri}\n"
}
}
}
}
}
这个主要是解决导入IDEA后下载依赖非常慢的问题!!!
编译源码
在Terminal中编译:
gradle :spring-oxm:compileJava正常情况,此时应该可以在GRADLE_USER_HOME指定的目录下载看到下载的Jar包和插件!
这一步还是比较快的,稍微等待。。。
直到编译成功。

曾经的老版本github上有个wiki,建议的是先编译spring-oxm这个模块,这里我也不太懂,反正无所谓跑一下吧。。。
导入IDEA
编译完成后就可以通过idea导入了
File => New => Project from ExistingSource 选择build.gradle然后点OK。
导入后还需要修改IDEA的gradle和项目的JDK配置。


排除spring-aspects模块:

这个模块里面好像需要其他的编译器,一般用不到,这里不配置了所以直接排除不编译即可。
然后再待IDEA编译即可,这个过程还是会下载包和插件,非常漫长。。。
如果没有触发,就点下右侧Gradle插件的刷新(类似于Maven的插件)。
编译完成,IDEA就会自动导入Gradle项目,应该是能识别各个模块的:

创建demo模块
接下来我们可以创建一个模块,来用spring了,方便调试。
右键父工程,新建模块。

创建完成后在build.gradle文件中添加依赖:
plugins {
id 'java'
}
group 'org.springframework'
version '6.2.11-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
// 需要显式依赖 spring-beans,@Component 在里面
implementation(project(":spring-beans"))
// 如果你要用 ApplicationContext / 注解扫描,还需要 spring-context
implementation(project(":spring-context"))
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}再在右侧刷新整个项目,就可以正常编写代码了:

参考文章
本文参考:https://blog.csdn.net/dndndnnffj/article/details/131107105
但我觉得上面的文章写的有点乱,它自己下载了Gradle又使用gradlew(gradle-wrapper)命令,感觉有点多此一举了。
资料
我的仓库:
git clone git@gitee.com:coderhexon/springframework6.git
依赖压缩包资源共享:
TODO