环境的搭建
Git
JDK8+ (master 分支需要 JDK 11)
Spring源码仓库地址(5.2.x 分支):https://github.com/spring-projects/spring-framework
master 分支需要 JDK 11
IDEA
gradle组件
下载gradle
如何安装Gradle此处省略,留一个传送门:Gradle
配置gradle
下载下来后解压
配置环境变量
GRADLE_HOME
GRADLE_USER_HOME
验证gradle
下载源码
clone 源码
git clone https://github.com/spring-projects/spring-framework.git
修改spring源码配置
Spring源码下载下来后,不着急导入idea,先修改几处配置
配置gradle的远程仓库
- import-into-idea.md:这是官方提供的spring源码导入idea的步骤和注意说明,我已经翻译过了,可以移步:IDEA导入Spring源码调试必看。
打开spring源码的gradle配置文件
修改settings.gradle文件
下载依赖的网络速度之不可描述原因,懂得人都懂,我们加上阿里云的maven仓库。
maven { url "https://maven.aliyun.com/repository/public" }
修改build.gradle文件
如下两处添加镜像源配置
配置阿里云仓库地址,在build.gradle文件的,在repositories配置项中添加阿里云仓库地址。
// 配置国内镜像源
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
或
修改gradle.properties文件
version=X.X.X-SNAPSHOT
设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
org.gradle.jvmargs=-Xmx2048M
开启 Gradle 缓存
org.gradle.caching=true
开启并行编译
org.gradle.parallel=true
启用新的孵化模式
org.gradle.configureondemand=true
开启守护进程 通过开启守护进程,下一次构建的时候,将会连接这个守护进程进行构建,而不是重新fork一个gradle构建进程
org.gradle.daemon=true
修改好之后如下图所示:
配置源码使用的gradle版本
distributionUrl=file:///E:/yuanma/gradle-4.9-all.zip
这里的distributionUrl的值指向我们下载的gradle-4.9-all.zip压缩包
修改spring-beans.gradle文件配置
注释掉部分报错配置,替换成新的配置
def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues
compileGroovy.dependsOn = deps - "compileJava"
compileKotlin.dependsOn(compileGroovy)
compileKotlin.classpath += files(compileGroovy.destinationDir)
使用 IDEA 打开
等待IDEA加载完成即可。
git clone -b 5.2.x https://github.com/spring-projects/spring-framework.git
注:也可以指定 clone 的分支或者先 fork 到自己的仓库,然后再clone。
执行测试
在项目右键创建 module
选择 Gradle Java
创建 module
在 build.gradle 中添加配置
compile(project(":spring-context"))
设置相关配置
例如可以加入JVM参数:
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
创建测试类并测试
其中 UserComponent 添加了 @Component 注解, 程序正常执行则一切 OK。可以开始愉快的调试代码了。
编译oxm、编译core
要编译整个spring的源码,我们需要预先编译 spring-oxm和spring-core,确保oxm和core模块编译成功后,即可编译spring整体
在gradle面板中找到如下按钮,点击即可编译oxm模块
编译结果如下
我这里因为已经编译过了,所以会比较快
同理,编译core模块
编译整个spring源码
确保oxm和core模块编译成功后,即可编译spring整体
结果如下:
到这里的话,其实spring的编译就完成了。项目的整体结构如下,并且各个模块在idea中都有一个蓝色的小标
验证
实践是检验真理的唯一标准,那么怎样验证我们上面的构建是否成功呢,很简单,写个demo测试一下就好了,下面进入验证过程。
- 在spring-framework-master项目下新建我们自己的测试module,如下图所示:
-
选择使用gradle
-
输入自己的module名
既然要验证,那我们肯定需要依赖spring的模块,我们在我们刚刚新建的模块下build.gradle文件中修改使用阿里云仓库,同时依赖spring-context等多个基础模块。
修改spring-自定义模块的build.gradle文件,新增依赖
compile(project(":spring-beans"))
compile(project(":spring-core"))
compile(project(":spring-context"))
compile(project(":spring-aop"))
- 刷新依赖,重新编译,速度同样飞快。
- 我们先写一个配置类
package com.libo.spring.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName: MazhichuConfig
* @Description: 配置
* @Author: Moore
* @Date: 2020-06-08 12:30
* @Version: V1.0
*/
@Configuration
@ComponentScan("com.libo")
public class MazhichuConfig {
}
- 写一个实体Bean
package com.mazhichu.spring.repository;
import org.springframework.stereotype.Repository;
/**
* @ClassName: Hello
* @Description: bean
* @Author: Moore
* @Date: 2020-06-08 12:30
* @Version: V1.0
*/
@Repository
public class Hello {
public void hello(){
System.out.println("Hello,ma_zhichu!");
}
}
- 编写测试类,运行,如下图所示: