🌑

Shawn Fux

Spring5.3.10源码编译

在通往探究 Spring 源码的道路上,很多人被夭折在了编译 Spring 源码的这一环节,笔者如是,通过搜寻大量相关文章,自己总结了一篇 Spring 源码编译安装的笔记,包含一些源码编译过程中遇到的问题。

下载Spring源码

首先打开Spring源码官方仓库 https://github.com/spring-projects/spring-framework

1

①第一步:点击这个 main 按钮,然后弹出一个下拉框

②第二步:点击 Tags 切换到具体的版本,这里展示了Spring的历史和最新版本,选择一个你想下载的版本即可

2

③第三步:点击 Code 按钮还是一个下拉框

④第四步:点击Download ZIP 下载源码

源码文件预处理

下载完成后用解压工具进行解压,应该会得到一份这样的文件,此时先不要急着导入 IDEA ,在导入之前还需要做一下预处理工作,以保证能正常完成编译。

3

查看Gradle版本

从源码的根目录进入gradle 目录,然后再进入wrapper目录,然后在该目录下有一个gradle-wrapper.properties文件,打开它应该会有如下内容

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

其中distributionUrl会在我们进行源码编译的时候,会从该地址下载gradle,因为 Spring 用的依赖管理是gradle 而不是 maven ,如果本地有下载好的 gradle ,也可以使用你本地下载好的,但是版本尽量保持与 Spring 源码内的 gradle 一致,把路径替换为你本地的即可 file\:///Users/xxx/xxxx/xxx/gradle-7.2-bin.zip

更换Gradle镜像源

由于 Spring 的 Gradle 源镜像默认使用的是国外的,下载起来会非常慢,所以需要替换成国内阿里云镜像,在 Spring 源码根目录下打开一个build.gradle的文件,新增加一行国内阿里云的镜像配置

maven { url 'https://maven.aliyun.com/repository/public' }

4

第二步还是在Spring 源码根目录下,打开一个settings.gradle的文件,新增一行镜配置

maven { url 'https://maven.aliyun.com/repository/spring-plugin' }

image-20220811121336074

预编译处理

打开控制台窗口,然后进入到 Spring 源码根目录下,开始进行预编译处理

Mac Os/Linux 请依次执行以下命令

./gradlew :spring-oxm:compileTestJava
./gradlew :spring-core:compileTestJava

Windows 用户依次执行以下命令

gradlew.bat :spring-oxm:compileTestJava
gradlew.bat :spring-core:compileTestJava

经过上面一些列预处理后,就可以开始导入 Spring 源码进行编译了

导入IDEA进行编译

导入build.gradle开始下载依赖

image-20220811122120705

第一步选择 File > New > Project from Existing Souces… 点击后,会弹出一个窗口

image-20220811122333846

第二步找到 Spring 源码的根目录下有一个 build.gradle 的文件选择它,然后点击OK就开始进行导入了。

image-20220811122709881

这时就进行漫长的等待了下载相关的依赖

新建一个测试项目

等所有依赖下载完毕后,建立索引完成后,你的目录应该会有一个小蓝点

image-20220811123038889

在创建项目运行之前,idea 默认使用的是 gradle 去编译运行,会非常的慢,我们需要做一些修改调整,更加符合我们平常用 idea 运行 java 项目的风格。

image-20220811125235891

此时我们就可以新建一个模块,开始愉快的对应 Spring 进行 Debug 调试了

第一步选择源码项目的根目录右键鼠标移除选择 New > Module..

img-2222

第二步填写项目的名称,然后点击 Create

image-20220811125848675

此时我们的项目就已经创建完毕,打开我们的项目,会有以下几个目录,其中 build.gradle 文件相当于我们 maven 的 pom 文件,用来管理我们的依赖

image-20220811130205707

第三步打开 build.gradle 文件添加你需要的依赖,这里我只添加了 Spring-context 的依赖

implementation(project(":spring-context"))

image-20220811130402816

具体依赖引入的一些语法,可以参考这里 https://developer.android.google.cn/studio/build/dependencies ,这里就不赘述了。

常见问题

java: 程序包jdk.jfr不存在

image-20220811131127309

这个问题是因为 jdk.jfr 是 java9 以后才有的模块,而高版本的 spring 源码已经使用这个包,所以我们需要设置我们项目配置的 jdk 版本高于9。然后还需要检查你的IDEA 编译版本是否高于9并且和你的运行版本一致。

image-20220811131436696

另外笔者发现一个坑,可能你做了某些设置以后比如说重新引入依赖,会发现又会报 java: 程序包jdk.jfr不存在的错误,那么你应该去检查一下你的编译版本是否又回退到1.8版本了。

java:找不到类 InstrumentationSavingAgent

新增一个依赖即可

implementation(project(":spring-instrument"))

image-20220811132431013

java: 程序包org.springframework.aop.target不存在

首先检查一下是否将target目录排除了

image-20220811162835286

或者看一下.gitignore文件中是否将target目录排除了,笔者就曾在这个问题上被坑了。

image-20220811163046581

参考资料

另外你可以直接下载我的仓库 的源码,已经配置好了镜像,你只需要预编译一下即可。

, — Aug 27, 2022