Spring5.2.x源码下载及编译

2020-12-14 11:15:24 浏览数 (1)

前言

学习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的工具进行编译)

代码语言:javascript复制
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系列的开始,没有环境的学习就像你想抬一个没有边角的桌子无处施力,如果大家在编译时有什么问题欢迎指出。

0 人点赞