Gradle编译Spring源码
使用工具:JDK1.8.0_11、Gradle4.9、idea2018.1.3
1. 配置Gradle
Gradle下载地址:https://gradle.org/releases/
在下载页找到自己需要的版本,点击“binary-only”,只下载运行包。
注意:不建议下载比较新的gradle版本,可能使用时会有各种冲突,我选择的是v4.9。
下载后的压缩包:gradle4.9-bin.zip
解压压缩包
配置环境变量:右键计算机->属性->高级系统设置->环境变量,在系统变量区域,点击新建,输入变量名为:GRADLE_HOME,变量值为:D:\Software\Gradle\gradle-6.1.1(根据实际情况)。找到Path,在原始内容基础上加入%GRADLE_HOME%\bin;,必须以分号结束。
最后重新打开cmd命令行,输入:gradle -v 检查是否配置成功。
2. 下载Spring源码
Git地址:https://github.com/spring-projects/spring-framework
下载地址:https://codeload.github.com/spring-projects/spring-framework/zip/5.1.x
打开这个地址,当前最新的版本是的Spring5.1.x版本的源码地址,如果要下载其他版本,可以点击红框处修改。
点击Clone or download 下载Spring的zip压缩包。
3. Idea导入Spring源码
1. 打开Idea,选择File---> New --> Project form Existing Sources
2. 选择要导入的spring-framework-5.0.x源码项目
3. 选择使用Gradle项目
4. 设置导入参数
选择"Use auto-import",表示同时下载相关依赖。
选择"Use local gradle distribution",表示引用本地的Gradle Home,选择安装的本地文件目录。
在"Gradle VM options:" 官方推荐在编译时把内存设置成2048M,内容: -XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
选择"OK",Idea就会自动编译,如下图:
这个过程只能算是下载编译时需要的依赖包,并不算真正的编译,整个过程根据网络情况时间不同,大概1个小时左右。依赖下载成功后的样子是这样的。
4. 导入时的常见错误
4.1 Uninitialized object exists on backward branch 365
出现这个错误,在网上翻阅了一些资料,都说是与JDK版本冲突造成的。
方案1:换其他版本的JDK挨个试。
方案2:点击“Open File”,会打开如下文件build.gradle文件,指定到我当前的第15行内容。把org.jetbrains.dokka的version的版本改小,再保存尝试编译,我改到0.9.15的时候才能正常编译。
4.2 Uninitialized object exists on backward branch 129
这个错误我是编译5.0.x版本的Spring源码出现的,这次报错的插件是kotlin,同样需要打开build.gradle文件,修改第14行org.jetbrains.kotlin.jvm的版本,我是改成了1.2.61可以正常编译5.0.x版本的。
4.3 No such property
点击“Open File”,会打开如下文件spring-beans.gradle文件,把下面第28行代码注掉。
4. 编译代码
在上面都执行完毕之后,只是完成了依赖包的下载,还没有真正的编译。在源码包的根目录下有个描述文件import-into-idea.md,大概意思是需要先编译spring-core和spring-oxm,这是其他模块的依赖,spring-aspects在编译时会报错,但不影响。
1. 首先编译核心项目spring-core、spring-beans、spring-context、spring-oxm,(尽量按照这个顺序执行,编译完核心包之后,其他的项目编译顺序就无所谓了)打开要编译的项目的test目录,在org.spring.framework路径上右击,选择“Run 'Test' in 'springframework'”
2. 错误1:我在执行test的之后还报错了,错误如下:
解决办法:这个主要是Kotlin插件的版本问题,解决方案是更新新版本的Kotlin插件。在idea 工具中File->Settings->Plugins输入Kotlin更新。插件更新之后要重启idea。
错误2:在运行测试用例时可能会提示cglib包找不到的问题
解决办法:在spring framework目录下执行gradle命令:
gradle objenesisRepackJar
gradle cglibRepackJar
这样就会下载包括cglib相关的依赖的了。
错误3:spring-oxm的特使用例,缺少Flights、Flight对象,这两个对象就是在测试用例目录的,就是没有,把这几个报错类注掉吧
3. 再次执行Run 'Tests' in 'springframework',等待直接结束,可能偶给别tests方法执行失败,可以忽略不计。(注意:如果运行时提示一些类找不到,可以先把错误的类注掉)
4. 执行Run Tests结束后,项目中会显示out文件夹,存放的是编译后的class文件。
5. 按照此方法,依次编译其他项目,至此,Spring源码编译完毕。
5. 测试
编译完成之后,在spring源码项目新建一个Module,选择gradle类型。
在新项目里的build.gradle文件中引用spring其他模块,如下:
dependencies {
compile project(":spring-context")
compile project(":spring-core")
compile project(":spring-beans")
testCompile group: 'junit', name: 'junit', version: '4.12'
}
编写测试代码,我这里包括三个类:1个dao,一个config,一个启动类
@Repository
public class IndexDao {
public void query(){
System.out.println("IndexDao query");
}
}
@Configuration
@ComponentScan("dao的路径")
public class AppConfig {
}
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
IndexDao dao = context.getBean(IndexDao.class);
dao.query();
}
}
查看Test类是否能正常运行,并查看运行结果,如果运行结果是IndexDao query,则证实Spring源码完全编译成功。