我是这样学习Spring源码的之如何使用IDEA编译Spring源码
  • 分类:Java技术
  • 发表:2019-03-21
  • 围观(5,782)

前言

Spring源码,可谓是教科书。你是否也在阅读Spring源码,想从中了解Spring的原理?但一将源码下载下来后,一编译,就会出现各种错误。然后,就开始找资料,各种资料翻来覆去,但可能只解决了你部分问题,后面还有更多的坑等着你去踩。其实我也是这样过来的。但今天,我将我的编译Spring源码的编译过程分享给大家,帮大家免去踩坑。把这只挡在阅读Spring源码前面的拦路虎给Kill掉。

前提准备

  1. 安装IDEA旗舰版
    如何安装IDEA不用我多说吧。相信大家都会!由于Spring需要Ajc编译器的支持,由于社区版不支持,所以此处我们选择旗舰版。
  2. 下载AspectJ
    Spring实现了AOP(面向切面编程),它依赖AspectJ,因此需要下载AspectJ并安装,同时配置好环境变量。
    具体操作步骤,请参见《什么是AOP?AspectJ了解一下!
  3. 重要角色:Spring源码
    Spring源码在GitHub上搜索一下很容易找到。

    可以直接使用git clone来下载源代码,也可以直接下载zip压缩包。
  4. gradle(可选)
    IDEA默认已经安装或者会自动安装gradle。gradle类似maven,可以构建项目,可以对包依赖进行管理。
    如何安装,很简单。
    第一步:从官网下载gradle。

    第二步:解压
    第三步:添加环境变量
    第一个环境变量为GRADLE_HOME,第二个环境变量为path;

    测试:在cmd命令提示窗口中,输入gradle -v,能够输出gradle的版本信息,说明安装成功。

    至此,前期准备已经完成,接下来,是时候展示真正的技术了!

详细步骤

其实,当我们下载好项目后,里边有一个import-into-idea.md这个文件,里边写得比较详细如何将Spring源码导入到idea。英语好的童鞋,可以按照此文件进行操作。

大致意思是第一步使用gradle命令,先编译spring-oxm:compileTestJava。./gradlew :spring-oxm:compileTestJava。第二步导入IDEA。第三步添加AspectJ Fects。这样做当然是没有问题的。下面请看详情。
1. 使用IDEA导入项目


导入后,gradle开始构建项目


使用spring自带的gradle库,构建的时候,会非常慢。我们可以使用国内阿里镜像库,速度会飞起来。详情,请参见《习惯了使用Maven,我们来看看IDEA怎么配置Gradle及国内镜像
2. 各个击破遇到的错误
当点击build后,会发现一大堆错误,不要着急,我们一个个来解决。
第一个错误:Error:(20, 50) java: 程序包org.springframework.objenesis.instantiator不存在。缺少jar包;
解决方法:执行执行spring-oxm的testClasses。其实import-into-idea.md文档中也写明了,需要先编译spring-oxm。

再次执行build,此错误已经解决,但还是有错误;
第二个错误:Error:(149, 36) java: 找不到符号:方法getResultStream() 位置: 接口 javax.persistence.Query

解决方法:发现这几个错误,主要在@Test测试方法中,并不影响我们阅读Spring源码。简单起见,直接将相关测试代码注释掉。
再次执行build,还是遇到错误,一波三折啊!
第三个错误:Error:(42, 16) java: 找不到符号
符号: 类 AnnotationTransactionAspect
位置: 类 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration

解决方法:主要原因是Idea默认使用的Javac编译器,而aspectj关键字它不认识。这个时候需要我们前期准备的AspectJ编译器Ajc了。
1. 将Idea的编译器设置为Ajc:
打开:IDEA--Preferences--Build,Execution,Deployment--Compiler--JavaCompiler,将Use compiler设置为Ajc,将Path to Ajc compiler设置为AspectJ安装目录下的lib文件夹中的aspectjtools.jar文件,同时,可以勾选Delegate to Javac选项,它能够只编译AspectJ的Facets项目,而其他普通项目还是交由Javac来编译。

2. 将spring-aop_main和spring-aspectjs_main两个模块添加AspectJ Facets:
打开:File--Project Structure--Facets,点击+号,选择AspectJ,选择spring-aop_main。添加完后,同样的操作,将spring-aspectjs_main模块也设置AspectJ。


再次执行build,已经没有错误了。

总结

至此,IDEA能够正确编译Spring源码了。我们愉快地可以开启我们的阅读Spring源码之旅了!


扫描关注,及时获取最新消息!

转载本站文章,请注明出处:呦呦工作室

Top