最近抽空在摸索spring源码,就想在idea中把spring源码环境给跑起来,以便于自己进行断点调试和学习,但在自己构建的时候才发现使用idea构建spring源码的环境的确不是一件简单简单的事情,下面就记录一下自己构建源码的过程和遇到的坑
1、安装gralde环境
可以通过这个链接下载合适的版本的gradle,建议不要下载抬高的版本,我这里使用的是4.4的版本,版本太高,后面在idea中编译的时候有些spring的组件下载不了:https://services.gradle.org/distributions/
gralde的安装非常简单,就和配置jdk一样的道理,将主目录配置到环境变量即可
然后加入到path中即可:
2、github下载spring源码
进入spring官网,然后从下面的窗口进入到github
右上角的小猫头像,到了这里想必大家肯定知道怎么下载了吧,我这里直接将zip的包下载到本地,对应的版本是5.x的
3、使用gradle编译源码
解压zip包,cmd代开打开窗口,直接在当前spring的根目录下执行命令:gradlew.bat即可,这个是spring提供的
编译的过程可能有点儿长,我这里等待了差不多4分多钟才全部执行完毕,
也有人说可以直接在idea中配置gradle的环境然后放到idea中进行编译,我这里直接在本地编译了
4、idea导入编译完成的源码
打开IDEA,File->New->Project From Existing Sources…,选中spring-framework源码文件夹,点击OK,选择Import project from external model,选中Gradle,点击Next
这里建议使用默认的就好,我第一次配置本地的gradle中间错了2次,意思大概是还要配置其他的依赖,所以就放弃了
导入后,idea就开始自动进行编译,导入相关的依赖jar包了,第一次会非常慢,需要点儿耐心
基本上看到这里就说明准备工作就全部完成了
5、编写测试代码
在根目录下创建一个子模块
配置一下依赖,就像maven中依赖某个pom一样,gradle默认创建时就有两个依赖,再加上spring-context即可
写一段测试的方法,这里我们想测试自己创建的bean是否能被spring管理,
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Main {
@Bean("person")
public Person person() {
return new Person("Hello");
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class);
System.out.println((Person) context.getBean("person"));
}
}
class Person {
String name;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String name) {
this.name = name;
}
}
然后直接运行这段程序,但是报了两个严重的错误,第一个错误的日志大致如下:
1、DefaultNamingPolicy依赖没有找到,即下面这个类
解决办法,分析原因后,它来源于spring-cglib-repack、spring-objenesis-repack这两个jar文件,因此需要把这两个依赖的jar包安装上,直接进入本地的源码主目录在cmd窗口执行:gradle objenesisRepackJar 、 gradle cglibRepackJar等待安装成功即可
第二个错误,从描述来看,应该是没有编译到这个文件,然后全局搜索一下定位到这个文件的位置,
Error:(26, 38) java: 找不到符号
符号: 类 InstrumentationSavingAgent
位置: 程序包 org.springframework.instrument
再次启动程序,经过短暂的等待后,控制台就打印了预想中的结果,说明通过源码的方式可以调试spring环境了
我们不妨随点点击进去看看,
这样的话点击进来就可以加注释,写笔记,写调试代码了,是不是很爽快
本篇到这里就结束了,希望对看到的同学有用,最后,感谢观看!