hexon
发布于 2025-11-25 / 6 阅读
0

1、Spring6源码编译

本文内容:

  • 拉取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