目录
一、下载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的源码文件还是非常多的,异常复杂:
拉取代码以后,查看拉取目录中的import-into-idea.md文档,这个文件是导入IDEA的操作文档,我们按照里面的操作即可:
相应地,也存在import-into-eclipse,导入Eclipse的操作文档,读者根据自己的环境选择对应的文档即可。
将import-into-idea.md文件直接使用浏览器查看:
二、安装Gradle
因为Spring源码使用的是Gradle进行编译,所以我们首先需要在本机安装Gradle环境。
【a】Gradle下载安装
Gradle官网最新发行版下载:Gradle | Releases
可以按自己需求自行下载,这里我是下载的最新的这里我们选择下载:gradle-4.10.3-bin.zip。
下载完成后,将下载的压缩包解压到本机的指定目录(这里解压的目录为E:\development\gradle\gradle-4.10.3)即可,如下图:
【b】配置Gradle的环境变量GRADLE_HOME
首先右键“此电脑”-->"属性"-->"高级系统设置"-->"环境变量"-->"系统变量",然后在系统变量下新建一个变量为GRADLE_HOME的变量,并将Gradle的安装目录路径(E:\development\gradle\gradle-4.10.3)设置为变量值。如下图所示:
【c】配置path环境变量
将Gradle的bin目录添加到path变量值中:%GRADLE_HOME%\bin或者E:\development\gradle\gradle-4.10.3\bin都可以。如下图:
【d】测试Gradle是否安装成功
打开cmd命令窗口,输入 gradle -v 或者gradle -version 查看Gradle版本信息:
我们看到,成功输出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
由于笔者网速不太好,所以这里我将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目录下,如下图:
接下来修改build.gradle文件:
找到repositories块,将地址改为国内地址,把里面的给注释掉。
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
如下图:
然后我们就可以重新执行./gradlew :spring-oxm:compileTestJava进行预编译。
如上图,可以看到,预编译成功。在编译过程中,可能会因为网络会报一些错误,如某个jar包没下载成功等,我们只需要重新执行./gradlew :spring-oxm:compileTestJava再次进行预编译就行了。具体可以通过--stacktrace将编译异常信息打印出来查看。
四、IDEA导入Spring项目
使用IDEA (File -> New -> Project from Existing Sources) 选中build.gradle文件:
然后设置Gradle相关信息:
然后IDEA就会开始进行build自动构建。
由上图可见,构建成功,但是Build成功不代表一定能运行成功,可能还是会遇到各种各样的问题,逐一解决即可。
五、排除spring-aspects模块
在IDEA中,排除某个模块很简单。打开File -> Project Structure窗口:
六、添加测试模块
1.项目根目录右键 -> new -> module -> gradle:
新建一个spring模块,起名:spring-test-demo,如下图:
下图为创建好的新模块:
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源码调试环境就算搭建成功了,接下来开启源码阅读之旅。
七、遇到的一些问题
以下是笔者在搭建过程中遇到的一些问题,读者也许不一定会遇到,也可能会遇到其他各种各样的问题,读者多多查阅一些资料,逐个解决即可。
【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的源码了。