源码获取
- 进入GitHub官网,搜索spring,找到spring-framework项目。如下图。

- 选择最新分支,这里我们选择5.1.x。如下图。

- 拉取到本地,或者直接下载。如下图。

源码导入构建
- 打开IDEA,导入源码工程。如下图。


- 选择Gradle项目导入,之后直接Finish即可。如下图。

- 导入后工程界面显示,如下图。
###解决编译错误问题一:cglib和objenesis jar包的缺失
- 问题发现:到了这里,我们执行build,会报错。如下图。

- 问题原因:为了避免第三方class的冲突,Spring把最新的cglib和objenesis给重新打包(repack)了。它并没有在源码里提供这部分的代码,而是直接将其放在jar包当中,这也就导致了我们拉取代码后出现编译错误。
- 问题解决:
- 确保机器安装好Gradle。并且设置好环境变量。
- 进入到源代码的目录下,执行命令来生成两个缺失的jar包。

- 将生成的两个jar包放到libs目录下,然后把libs目录拷贝到spring-core目录下。如下图。

- 最后对spring-core目录下的文件spring-core.gradle进行编辑。使得两个jar包成功被引用。
compile fileTree(dir: 'libs', include: '*.jar')。如下图。
- 重新编译,此问题不再提示错误。
###解决编译错误问题二:AspectJ编译
- 问题发现:虽然不再提示上面jar的错误,但此时提示另一个编译错误。如下图。类的声明居然使用了aspect而不是class。

- 问题原因:Spring为了支持AOP技术的实现,引入了AspectJ来实现这一重要功能。上图中的aspect并不是java支持的关键字,而是AspectJ才认识的关键字。而原来的javac是无法识别出类前的aspect的,需要使用ajc.exe来执行编译。可以简单理解为ajc命令是增加版的javac命令。
- 问题解决:
- 安装AspectJ,安装过程没有难点,选择最新稳定版安装即可,过程这里忽略。

- 为spring-aspect工程添加Facets属性。
【File】->【Project Structure】,进入到页面后点击“+”添加,如下图。
添加spring-aop_mian,结果如下图。
添加spring-aspects_mian,结果如下图。
删除Facets。

- 修改IDEA配置,使其支持Ajc编译。
【File】->【Setting】,修改地方如下图。

- 到此,重新编译,成功。还有一些测试类报错已经不影响调试阅读。可以直接删掉报错的地方,当然有兴趣解决的,也可以在另外自己解决。
整个Spring源码构建编译已完成。欢迎留言讨论分享~