版本工具:IntelliJ IDEA 2018-3,gradle4.9,jdk1.8.0_181,spring5.1.x, kotlin1.2.41,groovy2.4.12,
编译spring源码的方式有很多方式,小编知道的就有两种,一种是gradle编译,一种是借助编辑工具编译,比如说eclipse和IDEA,这里就拿IDEA举例说明。
gradle 和 jdk的安装这里就不再复述,度娘查一下很easy,基本操作,下面直接开始源码编译。
- 导入之前,我们先看源码根目录中的import-into-idea.md文件
注意几点:
- 因为其他项目需要依赖spring-core和spring-oxm,所以我们导入后需要先编译这两个包
- spring-aspects需要依赖三方jar,所以这里编译可能会报错,但是不影响我们编译使用,让我们忽略这个错误
- 使用工具编译时,我们需要调整写参数避免出现内存溢出导致编译不通过 -XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
- 在IDE中编译spring的源码,必须要先生成spring-oxm模块的资源
- 将源码导入到IDEA(将源码导入IDEA有两种方式), 源码地址:https://github.com/spring-projects/spring-framework.git
- 将源码下载到本地,解压之后导入到IDEA中
- 使用IDEA的git插件,直接从github上将代码导入到项目中
- 首先我们打开IDEA,选择地下的check pout from version control,选择git方式
- 输入源码地址和本地的目录,然后等待源码下载完成
- 选择使用gradle方式导入
- 注意截图部分中的配置项,选择自己本地安装的gradle,jdk的版本要1.8以上,对应的虚拟机参数调整
- 点击Finish,等到IDEA导入成功之后,我们切换下代码的版本,当前down下来的最新的是master版本,这里我们要编译的是5.1x版本,切换到版本5.1x后,IDEA会自动构建
- 项目在构建项目的时候可能会出现以下错误
- No such property: immutableValues for class: org.gradle.api.internal.tasks.DefaultTaskDependency,图截图所示错误解决办法:注释模块spring-bean中的spring-bean.gradle文件中的截图部分代码
- Could not find method useJUnitPlatform() for arguments ,错误如图所示解决办法:注释掉模块spring-test中的spring-test.gradle文件中的截图部分代码
- 小编在build两次之后,只出现了以上两处错误
- 下面开始编译spring-core的代码
- 以同样的方式分别去编译sping-bean spring-context spring-oxm模块
- run test的时候,可能会出现以下错误。产生问题的原因:sping-core会依赖两个核心的jar 解决方法:cmd窗口进入到sprng-core目录,执行命令gradle build,直到出现BUILD SUCCESSFUL,如图所示:
- 出现这个异常Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 解决方法:在cmd窗口查看自己kotlin的版本
- 修改工程根目录下的build.gradle文件中的对应kotlin版本号(编译通过后,小编无意还原了github上的代码,kotlin的版本回滚到了1.2.71,发现并不会影响到源码的编译,这个可以忽略,但是也可以作为一个参考点)
- 以及IDEA编辑器中的kotlin版本
- 重新run test。 在run test其他模块的过程中,可能会出现,有些错误是可以忽略的,在你无法鉴定这个错误是不是可以忽略的时候,你就直接执行下面的步骤,新增module来测试代码能不能运行,debug能不能调试到spring源码中去,这里好像没有一个绝对的标准
- 新增Module来测试源码编译是否通过
- 右键spring工程,新增一个module
- 选择gradle Module,下一步
- 输入模块名称,下一步,然后finish,新增module成功
- 维护新增module对spring-context的依赖关系
- 编写测试代码
- 右键run Test.Main,查看输出结果
- 至此,sping源码在IDEA中编译完成,大功告成。