使用idea+gradle编译spring5.X源码@TOC
使用idea+gradle编译spring5.X源码
作为一个开发三年的技术小白,都没有编译一下spring源码,现在我尝试一下编译源码,并把编译过程中遇到的坑记录一下,希望能对很多像我一样的人起到参考作用
版本工具:spring5.0.x,gradle4,9,jdk1.8_131,IntelliJ IDEA 2018-2
-
下载gradle ,,可以去官网下载,gradle版本需要4.2以上,小编这里选择的是gradle4.9版本。
gradle下载地址:https://services.gradle.org/distributions/;
gradle下载时候有三个包,gradle-src为gralde源码,gradle-bin为安装包,gradle-all为源码加安装包,我们这里只需下载安装文件即可。
2. 配置gradle;
gradle下载后不需要安装,解压再本地磁盘后配置环境变量即可
1),配置gradle环境变量
新建GRADLE_HOME,path中增加%GRADLE_HOME%/bin;即可
配置完成以后win+r,输入cmd进入dos界面,键入命令gradle -v,若如下图正确输出版本信息即可
2),配置gradle默认的本地仓库,gradle和maven类似,工作时也需要一个本地仓库,管理工程jar包,可做如下配置,新增GRADLE_USER_HOME,路径配置成需要的本地仓库路径即可。和maven一样
- 下载spring5源码 ;(这里我们直接从全球最大的同性交友平台github上下载就可以了),进入github官网,直接搜索spring
这里可能有很多同志上传的spring源码,这里我们直接找官方版本
进去之后会看到一个master版本,我们,同时也包含很多spring的历史分支版本,这里我们直接选择5.0.x版本
我们直接下载zip到本地磁盘即可,我们也可以直接在IDEA里面从github导入
这个过程很漫长,我这里网速还行,只用了半个小时,导入之后我们打开,然后gardle开始构建 下载 时间也很长,耐心等待,最后下载完成以后,会弹出配置gradle的设置项
- spring5源码导入idea进行构建 ;
- 首先我们打开源码下载的目录 有一个import-into-idea.md文件
我们点开import-into-idea.md文件
a,因为其他项目需要依赖spring-core和spring-oxm,所以我们导入后需要先编译这两个
由于是第一次编译,所有编译时间可能需要几分钟,小编这里花了接近 3分钟,在这个过程当中,小编这里直接编译成功 如果遇到找不到类的错误
原因是因为cglib和objenesis编译错误,从书上看,为了避免第三方class的冲突,Spring把最新的cglib和objenesis给重新打包了(repack),并没有在源码里提供这部分代码,而是直接将其放在 jar报当中,也就导致了我们拉取之后编译错误,所以我们要把缺失的jar补回来
解决办法:
1,缺失jar引入
2,新增jar在gradle中生效,因为整个spring都在gradle环境中,所以要使jar生效就必须更改gradle配置文件:
compile filetree(dir: ‘libs’,include : ‘*.jar’)
编译成功后如图:
接下来编译spring-oxm模块
编译过程中会出现提示错误信息,我们忽略这个信息
执行完了后,接着编译spring-context,spring-bean
因为前面两个模块已经编译过了,所以这两个模块的编译很快,最后,就是aop了,我们知道springAop接住了aspectj的语法,所以我们也需要编译spring-aspectj模块,但是由于aspectj的语法javac不支持,所以我们需要对spring-aspectj单独指定编译器 具体解决办法如下:
1.官网下载aspectj的最新版本的jar包
2.打开命令行,切换路径到下载好的aspectj jar包目录 并且使用 java -jar执行 ,安装aspectj
3.安装完成以后,我们到idea当中区设置更改编译器为Ajc,如图:
设置Facets(1)
设置Facets(2)
设置Facets(3)
删除Facets(4)
更改编译器
注意画中的箭头指示及内容,不要选错了,如果选错 可能会导致编译失败,确认好以后,开始编译,这个过程也有点长 耐心等待
到了这里,spring的源码基本编译完成,已经 够我们学习使用了,最后我们自己新建一个module进行测试,module可选gradle构建,也可以选择maven构建,这里,小编选择了maven构建,导入spring-context的依赖
参考博文:https://blog.csdn.net/baomw/article/details/83956300
到此,源码编译成功 ,以后我们学习源码也在此基础之上