前言
学习Spring源码的重要前提,则是需要去编译源码到本地环境,这样则是方便我们在本地环境添加注释、断点调试、查看类图等,不过相信很多小伙伴在编译Spring源码的过程中相继遇到了很多困难而导致放弃学习,而本文就是来阐述如何正确编译Spring的源码,最好网速一定要好,否则编译源码会让小伙伴们体验极差。
Spring源码编译环境
环境及版本介绍 JDK环境:1.8及以上 Spring版本:作者在写本文的时候是用的5.2.10.RELEASE版本,但是现在Spring官网release版本已经到了5.2.12了 开发工具:IntelliJ IDEA 2019.3 编译工具:Gradle-5.6.4-bin 操作系统:windows 10
前置准备
1.安装并配置JDK环境
这里笔者就不演示配置了,百度有很多,小伙伴们可自行百度哈
2.下载和配置Gradle编译工具
访问Gradle
代码语言:javascript复制https://services.gradle.org/distributions/
注意:不建议下载比较新的gradle版本,可能使用时会有各种冲突,我选择的是下载gradle-5.6.4-bin源码包
下载并解压压缩包
配置Gradle环境变量
新建变量 变量名:GRADLE_HOME 变量值:解压到的目录
新建变量 变量名:GRADLE_USER_HOME 变量值:自定义Gradle仓库目录或者Maven的仓库目录
新建变量 变量名:Path 变量值:%GRADLE_HOME%bin;
验证Gradle是否安装成功
在命令行工具里面,输入 gradle -v,如下图则代表安装成功
3.下载Spring源码
1.访问Spirng官方
代码语言:javascript复制https://spring.io/
2.下图有很多Spring开源的项目,我们选择Spring FrameWork即可
3.我们点击Github头像,跳转到github中
4.我们下载relese分支即可,不要下载其他的分支,其他分支是不稳定的
5.这里多种下载方式,我这里选择直接下载压缩包,小伙伴自己喜欢什么方式下载,选择什么方式即可
6.我这里选择直接下载压缩包啦 ,然后解压
到此我们Spring源码就已经下载完成了,接下来开始编译源码啦
编译Spring环境
进入Spring源目录
看到上图我所指向的地方,该地方gradlew.bat就是等下我们需要运行的命令;但是先不着急运行;因为这个命令会去读取一个文件;在这个文件当中配置了gradle的版本和下载地址;一旦运行变化自动下载,有时候会下载不过来,就算下载过来了目录在哪里也是他自动指定的,下载过来后解压目录等等都是在那个文件里面配置,索性我们自己下载过来然后修改这个配置文件;
我们从根目录进入 gradle/wrapper 文件夹,修改gradle-wrapper.properties
文件
Spring程序是通过grale进行编译的,我们现在有两种选择方式
1.我们本地无需下载Gradle,在下面这个配置里面,通过远程gradle下载编译
2.我们本地下载Gradle,下载目录等地址我们都可以自定义(我这里用的是本地下载gradle的工具进行编译)
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-bin.zip
distributionUrl=file:///d:/software/gradle-5.6.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionBase 下载之后的目录(从distributionUrl下载过来是一个zip文件,存放的目录) distributionPath 会自动拼接 distributionBase zipStoreBase 是解压目录
改完这个配置也不要急着运行命令编译,因为当自动下载完gradle之后会通过gradle去编译spring源码,这里就涉及到一个gradle的中央仓库的问题了,编译过程中会下载大量的依赖,如果你采用默认的依赖那么这个编译过程一定特别漫长,而且会失败,于是我们需要修改中央仓库为国内的阿里云,这样就会快很多,如何修改呢? 返回根目录,找到 build.gradle文件,打开并且编辑添加阿里云的仓库
代码语言:javascript复制repositories {
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
至此万事具备只欠东风了,cmd到项目根目录运行 gradlew.bat 这个过程会相当漫长取决于你的网速,因为我之前已经编译过了,中间缓慢的过程笔者无法展示出来,不过小伙伴需要耐心等待 可能最后结果会失败,如果显示失败就再运行一遍gradlew.bat直到他编译成功;下图是显示编译成功的结果
执行指令预编译spring源码(可能需要耗时几十分钟,看网速) 然后再打开源码所在文件夹,在windows cmd命令中输入
代码语言:javascript复制gradlew :spring-oxm:compileTestJava
如上图就编译完成了,可以开始愉快的Spring源码之旅了
我们导入项目之前,先任意打开一个你之前的项目,先对IDEA的Gradle进行全局设置一下哦 我们看到如下图操作 Gradle user Home:因为我spring编译使用的是本地gradle,所以这里选择本地gradle仓库 User Gradle from: 我们选择Specified location,然后在后面我们选择自己的解压后的gradle目录(如果不选择,默认使用idea的gradle,又会重复下载jar,所以记得设置自己的gradle)
设置完成后,我们就着手准备导入Spring源码项目啦
然后选择根目录中的build.gradle文件进行导入
我这里大概等了10分钟左右就初始化完了
初始化完成之后,最好在点击一下刷新按钮,防止网络波动原因,导致前面初始化操作,可能jar下的不完整
正确构建之后如下图
接下来要对idea进行设置,不然每次idea运行都会通过gradle去编译运行gradle运行编译特别慢,需要改成idea自己编译运行
再次说明一下这里不是一定要改,但是如果你不改用默认的则会启动特别慢,改成idea快的不止一点点 改完之后便可以建一个子model来测试了,但是一定得建gradle的项目,因为spring源码这个父项目就是用gradle来开发的
建好项目之后再gradle的配置文件中添加spring的依赖——相当于你建了一个maven项目,在pom文件中添加spring的依赖
代码语言:javascript复制compile(project(":spring-context"))
然后开始开始完善项目的其他类 配置类的代码
代码语言:javascript复制@Configuration
@ComponentScan(value = "com.dream.sunny")
public class SunnyConfig {
}
普通注入类代码
代码语言:javascript复制@Component
public class InstanceA {
}
@Component
public class InstanceB {
}
启动类
代码语言:javascript复制public class SunnyStart {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SunnyConfig.class);
System.out.println(annotationConfigApplicationContext.getBean(InstanceA.class));
}
}
右键运行——可能你会出现一些错误;比如笔者这里就出现了某些类找不到的错误
如上图所示,出现的错误,小伙伴可以按照我下面的步骤去解决即可
当再次右击运行的时候,又会出现找不到某些类的情况
遇到这种问题是因为这个类所在的项目没有编译这个类—说白了就是没有产生class文件;比如上图那个错误便是没有找到 InstrumentationSavingAgent 这个类,那么你首先找到这个类所在的项目(InstrumentationSavingAgent类所在的项目为spring-instrument);再看看out文件下面是不是有这个class;比如笔主这里连out文件夹没有—build文件下下面是gradle产生的,我们上面已经把编译方式改成了idea,idea默认编译文件为out——说白了就是这个build可以直接删除;out文件夹都没有表示这个项目当中的java类idea压根没有编译;我们可以运行这个项目下面的测试类test让idea去帮我们编译这些java类 老套路,小伙伴跟着我的步骤即可解决啦
找到test文件夹下面的java文件夹右键 run all tests
出现如上图的错误,小伙伴不必担心,完全可以忽略掉,因为我们运行tese包,但是包中没有一个类,但是IDEA还是会帮我们编译的,只是编译是个空的 我们仍然可以看到out文件夹产生了
好,问题解决完成后,我们再次运行我们的启动类,如下图就成功啦.
至此,Spring源码如何在IntelliJ IDEA如何编译这篇文章就废话完毕了。 写这篇文章目的我希望把它作为Spring系列的开始,没有环境的学习就像你想抬一个没有边角的桌子无处施力,如果大家在编译时有什么问题欢迎指出。