目录
由于spring5.3.10用到了jdk高版本的jfr功能,因此我们编译spring需要用到JAVA9以后的版本,但是我们平时开发项目以java8为主,因此不想切来切去,想用java直接编译spring,阅读最新版的spring代码。
一、编译主模块
环境准备
下载完spring的的代码,直接导入idea,先说明一下我用的组件版本:
gradle:gradle-7.2-bin.zip
JDK:JDK1.8_301(我试过用1.8_201不行,最好用我这个版本(1.8_301),不然有些文件编译不了,我也找不到原因)
配置gradle
在build.gradle文件配置以下类容,加快加载依赖的速度:
repositories {
//新增以下2个阿里云镜像
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" }
//新增spring插件库
maven { url "https://repo.spring.io/plugins-release" }
}
修改gradle版本
到这就刷新gradle,等待下载
编译模块
主要编译模块有:
spring-core
spring-aop
spring-beans
spring-context
依次点击gradle的构建
构建过程中,有类会报错的,主要以下两个类,
FlightRecorderStartupStep.java
FlightRecorderStartupEvent.java
把相关jsr的类注释掉即可
一般我们是用不上这类的
新建项目测试
经过以上步骤,基本上都配置完了,我们需要的是测试一下,新建项目是否可以跑起来,并且断点调试。
直接idea,右键新建module,目录结构
把相关的依赖引入,写一个main方法,
public static void main(String[] args) {
//System.out.println("哈哈哈啊啊哈");
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
//context.refresh();
UserService userService = context.getBean(UserService.class);
userService.test();
System.out.println("哈哈哈哈哈哈");
}
正常是能通的了,这个时候如果遇到控制台乱码什么的,请配置一下
help-->Edit Custom VM Options... 加上编码配置就行
二、编译aop模块
当我们需要调试aop的时候,这时候,我们需要引入aspects的注解,这个时候我们需要引入spring-aspects模块,但是这个模块有.aj文件是需要ajc编译器才能编译的
下载aspectj-1.9.6.jar 包
安装,直接双击,下一步,下一步。。。需要记录一下安装的路径,因为等会配置需要用到
安装idea插件
在pluginsz直接搜索,点解安装
然后在settings--Compiler--Java Compiler中的use compiler:选择Ajc
使用aspectJ编译项目
配置完成后,我们需要编译一下aop,和aspectJ项目
file-project structure-modules下面
spring-aop和spring-aspects 分别执行
执行完后的效果是这样的,
到这里,可以在自己写的项目中,引入模块,并且写一个aop测试和调试
测试
执行成功。。。
参考文章:
spring源码项目使用spring-aspects_gsy159369的博客-CSDN博客
三、解决每次运行都执行gradle任务
当我们构建完spring源码项目,我们会发现,在module里面执行自己的main方法,都会去执行很多gradle的task,导致我们自己的方法执行很慢,这个时候,我们可以修改一下idea的配置,可以不用执行这些task
修改完之后,项目运行会报错,因为gradle默认的编译路径是build目录,我们改为idea后,默认是out目录,这个时候会同时存在两个目录:
按报错的意思,就是有冲突,我们需要把build目录删除,或者clean掉,留下out,然后可以在重新点击编译相关项目,然后运行我们的例子就可以了。正常是没问题的了。