spring源码本地DEBUG环境配置
一、源码下载
spring源码地址:
https://github.com/spring-projects/spring-framework
二、本地环境配置
使用的是win10操作系统。
我这里下载的spring是5.3.x的版本。具体的版本从源码中配置文件确认是5.3.32-SNAPSHOT。
2.1、JDK配置
当前版本的源码需要java11。如果你本地已经安装了其他版本的JDK,可以下载解压即用的JDK即可(之后在IDEA中配置SDK即可)。
2.2、gradle配置
gradle与maven功能相同,spring使用gradle。
每个spring的版本使用的gradle版本不同,可以从下面的配置文件中确认:
spring-framework-5.3.x/gradle/wrapper/gradle-wrapper.properties
文件中有如下配置
distributionUrl=https://services.gradle.org/distributions/gradle-7.5.1-bin.zip
可以确认我下载的spring版本需要gradle的版本为7.5.1。
2.3、IDEA版本
我下载的spring版本至少需要IDEA2021版本。因为spring源码中有许多的kotlin代码,我开始是用IDEA2020,编译的时候提示kotlin版本过低,从IDEA中查看对应的插件无法升级,只能升级IDEA的版本到2021。
2.4、spring源码中相关配置修改
2.4.1、gradle下载地址修改
我们如果不进行配置,则会自动从distributionUrl指定的网址下载对应版本的gradle软件。几乎不会下载成功。我们修改为使用本地gradle压缩文件。
源码文件:
spring-framework-5.3.x/gradle/wrapper/gradle-wrapper.properties
文件中有如下配置:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
修改为(你安装gradle时的zip包):
distributionUrl=file:///D:/gradle/gradle-7.5.1-all.zip
2.4.2、依赖包下载地址修改
spring源码中指定了依赖jar包的下载地址。我们需要改成国内的。
文件1:
spring-framework-5.3.x/build.gradle
找到如下的配置:
repositories {
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
在其中添加阿里仓库地址:
repositories {
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
文件2:
spring-framework-5.3.x/settings.gradle
找到如下的配置:
repositories {
mavenCentral()
gradlePluginPortal()
maven { url "https://repo.spring.io/release" }
}
在其中添加阿里仓库地址:
repositories {
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
mavenCentral()
gradlePluginPortal()
maven { url "https://repo.spring.io/release" }
}
2.5、源码导入IDEA
首先看下一源码中的文件spring-framework-5.3.x/import-into-idea.md,文件中我们关注如下内容:
## Steps
_Within your locally cloned spring-framework working directory:_
1. Precompile `spring-oxm` with `./gradlew :spring-oxm:compileTestJava`
2. Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
3. When prompted exclude the `spring-aspects` module (or after the import via File-> Project Structure -> Modules)
4. Code away
第一步先不用管。
第二步就是将源码导入IDEA。我们按照Spring的建议导入。
IDEA打开spring项目后,先配置JDK。
File→Project Structure
将JDK关联到spring工程,如下图:
再配置gradle,如下图:
依赖包有个默认下载路径,我们可以进行修改。
构建窗口出现如下提示则说明工程构建成功(我这里第一次构建下载jar包花了快7分钟,第二次就很快了)。
2.6、验证
我们执行spring源码中的一个单元测试看一下结果。
选择core包下的任意一个单元测试代码执行,提示如下错误:
这是因为spring包依赖cglib相关的jar包,这里需要对spring-core模块进行预编译(spring工程导入IDEA步骤中的第一步就是对oxm和core工程预编译)。我们直接对整个工程编译。如下图:先clean再build,之后我们就可以看到spring-core下多了build目录,打开会发现其下的lib目录下会出现cglib相关的jar包。我们再执行单元测试就通过了。
FAQ
1、jdk.jfr不存在错误
此错误是由于JDK版本导致的错误,请检查JDK的设置(即使你确定设置过了,请再检查下),如下:
1、检查工程的JDK设置(最好顺便看下Modules中每个模块的JDK设置是否正确),如下图:
2、检查java 编译时的JDK设置,如下图: