目录

一、下载Spring源码

 二、安装Gradle

三、预编译spring-oxm模块

四、IDEA导入Spring项目

五、排除spring-aspects模块

六、添加测试模块

七、遇到的一些问题


为了能够在调试Spring源码的时候,可以加上一些注释以及理解,方便后续继续复习,但是如果直接使用Class文件调试的话,是没法编辑的,只有在本地搭建Spring源码环境才行,所以本篇文章笔者将记录搭建Spring源码环境的步骤、遇到的问题及解决方案。

一、下载Spring源码

由于github下载比较慢,笔者使用的是码云上面的Spring源码地址:Spring-Framework: Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本

这里我们选择使用5.1.x版本,读者自行选择对应的版本即可。

首先将Spring的源码克隆下来,命令如下:

git clone -b 5.1.x https://gitee.com/mirrors/Spring-Framework

如下图,可以看到Spring的源码文件还是非常多的,异常复杂: 

 

spring源码启动 spring源码环境搭建调试_spring源码启动

 拉取代码以后,查看拉取目录中的import-into-idea.md文档,这个文件是导入IDEA的操作文档,我们按照里面的操作即可:

spring源码启动 spring源码环境搭建调试_Spring_02

相应地,也存在import-into-eclipse,导入Eclipse的操作文档,读者根据自己的环境选择对应的文档即可。

将import-into-idea.md文件直接使用浏览器查看:

spring源码启动 spring源码环境搭建调试_spring_03

 二、安装Gradle

因为Spring源码使用的是Gradle进行编译,所以我们首先需要在本机安装Gradle环境。

【a】Gradle下载安装

Gradle官网最新发行版下载:Gradle | Releases

可以按自己需求自行下载,这里我是下载的最新的这里我们选择下载:gradle-4.10.3-bin.zip。

下载完成后,将下载的压缩包解压到本机的指定目录(这里解压的目录为E:\development\gradle\gradle-4.10.3)即可,如下图:

spring源码启动 spring源码环境搭建调试_spring_04

 【b】配置Gradle的环境变量GRADLE_HOME

首先右键“此电脑”-->"属性"-->"高级系统设置"-->"环境变量"-->"系统变量",然后在系统变量下新建一个变量为GRADLE_HOME的变量,并将Gradle的安装目录路径(E:\development\gradle\gradle-4.10.3)设置为变量值。如下图所示:

spring源码启动 spring源码环境搭建调试_Spring源码环境_05

 【c】配置path环境变量

将Gradle的bin目录添加到path变量值中:%GRADLE_HOME%\bin或者E:\development\gradle\gradle-4.10.3\bin都可以。如下图:

spring源码启动 spring源码环境搭建调试_spring源码启动_06

 【d】测试Gradle是否安装成功

打开cmd命令窗口,输入 gradle -v 或者gradle -version 查看Gradle版本信息:

spring源码启动 spring源码环境搭建调试_spring_07

我们看到,成功输出Gradle对应的版本信息,证明Gradle已经安装成功。

三、预编译spring-oxm模块

打开刚拉取下来的Spring源码的根目录,使用Git命令进行预编译:

./gradlew :spring-oxm:compileTestJava

执行命令后,会显示正在下载gradle-4.10.3-bin.zip,这个正在下载的Gradle版本就是用来编译你对应Spring源码的版本。

我们从下面的目录也可以看到:Spring-Framework\gradle\wrapper\gradle-wrapper.properties

spring源码启动 spring源码环境搭建调试_spring源码启动_08

由于笔者网速不太好,所以这里我将gradle-wrapper.properties里面的distributionUrl修改为本地的gradle-4.10.3-bin.zip,这样快一些。 

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=gradle-4.10.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

然后将前面一个步骤下载的gradle-4.10.3-bin.zip压缩包放入Spring-Framework\gradle\wrapper目录下,如下图:

spring源码启动 spring源码环境搭建调试_spring源码启动_09

 接下来修改build.gradle文件:

spring源码启动 spring源码环境搭建调试_spring源码启动_10

 找到repositories块,将地址改为国内地址,把里面的给注释掉。

maven { url "http://maven.aliyun.com/nexus/content/groups/public" }

如下图:

spring源码启动 spring源码环境搭建调试_Spring源码环境_11

 然后我们就可以重新执行./gradlew :spring-oxm:compileTestJava进行预编译。

spring源码启动 spring源码环境搭建调试_Spring源码环境搭建_12

 如上图,可以看到,预编译成功。在编译过程中,可能会因为网络会报一些错误,如某个jar包没下载成功等,我们只需要重新执行./gradlew :spring-oxm:compileTestJava再次进行预编译就行了。具体可以通过--stacktrace将编译异常信息打印出来查看。

四、IDEA导入Spring项目

使用IDEA (File -> New -> Project from Existing Sources) 选中build.gradle文件:

spring源码启动 spring源码环境搭建调试_spring源码启动_13

然后设置Gradle相关信息:

spring源码启动 spring源码环境搭建调试_Spring_14

然后IDEA就会开始进行build自动构建。

spring源码启动 spring源码环境搭建调试_spring_15

由上图可见,构建成功,但是Build成功不代表一定能运行成功,可能还是会遇到各种各样的问题,逐一解决即可。

五、排除spring-aspects模块

在IDEA中,排除某个模块很简单。打开File -> Project Structure窗口:

spring源码启动 spring源码环境搭建调试_Spring源码环境_16

六、添加测试模块

1.项目根目录右键 -> new -> module -> gradle:

spring源码启动 spring源码环境搭建调试_spring源码启动_17

 新建一个spring模块,起名:spring-test-demo,如下图:

spring源码启动 spring源码环境搭建调试_spring源码启动_18

下图为创建好的新模块: 

 

spring源码启动 spring源码环境搭建调试_spring_19

2.在新项目的build.gradle下添加对spring模块的依赖,这里我先添加了spring-beans 和spring-core的依赖,如下:

dependencies {
    compile(project(":spring-beans"))
    compile(project(":spring-core"))
    compile(project(":spring-context"))
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

3.创建测试bean

package com.wsh;

/**
 * @version V1.0
 * @ClassName: com.wsh.User.java
 * @Description:
 * @author: weixiaohuai
 * @date: 2021/4/7 14:59
 */
public class User {

   public void hello() {
      System.out.println("hello, spring...");
   }

}

4.在新项目的src/main/resource下添加spring-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

   <!--配置Bean: User-->
    <bean id="user" class="com.wsh.User"/>

</beans>

5.测试

package com.wsh;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Description: 测试
 * @author: weixiaohuai
 * @Date: 2021/4/7 15:01
 */
public class SpringDemo {
   public static void main(String[] args) {
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
      User user = (User) applicationContext.getBean("user");
      user.hello();
   }
}

启动main方法,运行结果如下:

spring源码启动 spring源码环境搭建调试_Spring源码环境_20

如上图,运行成功,至此,Spring源码调试环境就算搭建成功了,接下来开启源码阅读之旅。

七、遇到的一些问题

以下是笔者在搭建过程中遇到的一些问题,读者也许不一定会遇到,也可能会遇到其他各种各样的问题,读者多多查阅一些资料,逐个解决即可。

【a】找不到类 InstrumentationSavingAgent

解决方法:修改spring-context\spring-context.gradle文件中,将optional修改为compile

compile(project(":spring-instrument"))
// optional(project(":spring-instrument"))

【b】Could not find com.ibm.websphere:uow

解决方法:在build.gradle上加上如下配置 :

repositories {
	maven { url "https://maven.aliyun.com/nexus/content/groups/public" }
	maven { url "https://repo.springsource.org/plugins-release" }
	//mavenCentral()
}

至此,我们的Spring源码阅读环境搭建成功,可以愉快的调试Spring的源码了。