对于想阅读Spring 源码的小白来说,第一次编译Spring 源码,是个很头疼的事情。即使本人阅读调试过很多次Spring 源码,但每次阅读Spring 源码就要编译一次(中间换过好几次电脑),但这个过程并不顺利。下面就做个详细的记录吧。
本文编译的Spring 源码是v5.2.x 版本,仅供参考。
对于最新Spring 版本的源码编译会遇到很多问题,下面也会说明。
1. 环境搭建
编译源码遇到的第一个问题就是,源码下载。
由于Spring 源码是托管在github 上的,都懂的,从github 上下载这么大的代码是个巨大考验,本人一开始试过很多次,都以失败告终。
解决办法:用gitee 从github 上导入spring 的源码,然后从gitee 上下载源码,速度快了10 倍以上吧。
将Spring 源码同步到gitee 上后,那么下面就是将代码clone 到本地了。这里git 就不介绍了。
这里需要注意的是,clone 源码的版本,再次说明,本文是基于v5.2.x 版本。
本人一开始没有指定版本,直接下载的最新版本,结果在编译结束后,由于最新版本对于JDK 版本要求的原因,花费了半天时间,很是头疼。最新版本要求JDK 为17 ,即使把编译JDK 条件改为8 ,最后也是产生了很多问题,编译过了,但运行代码会有问题。
对于很多文章解决版本的方法是设置JDK 的Setting 和Project Structure ,都没用。需要全局搜索sourceCompatibility ,将其改为8 。这种方式本人试过,源码编译没问题,但运行代码时,还是会报JDK 的问题。
所以本人放弃了安装JDK17 的想法,换了另一种方式,指定了Spring 源码的版本。但如果使用了指定的JDK 版本,编译肯定也能解决的。
2. 代码编译
将源码clone 到本地后,可以先修改几个配置文件,再用idea 进行导入。因为idea 导入这个工程,本人windows 系统花了将近3 个小时!!!据说Mac 会很快。
2.1 编译代码
2.1.1 build.gradle
此文件需要修改两处
2.1.1.1 第一处
注释掉企业限制:id 'io.spring.gradle-enterprise-conventions' version '0.0.2'
2.1.1.2 第二处
添加阿里云镜像仓库,在源码文件夹根目录下找到build.gradle (相当于maven 的pom ),找到repositories 配置向,编辑修改镜像仓库配置,加快下载项目依赖的速度。
repositories {
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
2.1.2 gradle.properties
向末尾追加两行,如下。对于org.gradle.jvmargs=-Xmx1536M 属性,可改可不改
version=5.2.8.RELEASE
org.gradle.jvmargs=-Xmx1536M
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.daemon=true
2.1.3 settings.gradle
增加国内镜像:
pluginManagement {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://repo.spring.io/plugins-release' }
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
}
}
对于gradle 安装的问题,可以安装,也可以不安装,如果不安装,idea 在导入工程时会自动下载gradle
修改完上面三个文件,就可以用idea 导入工程了,在网络条件很好的情况下,此过程花费了近3 个小时!!!很是恼火。
2.2 遇到问题
在编译完后,控制台出现了下面这样的报错:
POM relocation to an other version number is not fully supported in Gradle : xml-apis:xml-apis:2.0.2 relocated to xml-apis:xml-apis:1.0.b2.
大致意思是需要将xml-apis:xml-apis 的版本换为1.0.b2 ,在项目中全局搜索xml-apis ,需要修改build.gradle 文件中的下面配置:
configurations.all {
resolutionStrategy {
force 'xml-apis:xml-apis:1.0.b2'
cacheChangingModulesFor 0, "seconds"
cacheDynamicVersionsFor 0, "seconds"
}
}
除了上面的报错,还有乱码问题,这个解决版本就清楚多了:setting 选项中的File Encodings
2.3 编译结果
最终编译成功了!!!!
3. Module测试
编译成功后,就可以自己编写Module ,然后引入Spring 的模块了。
在build.gradle中添加spring-context的依赖:
编写测试代码
public static void main(String[] args) {
AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext();
acac.register(AppConfig.class);
acac.refresh();
Y y = (Y) acac.getBean("x");
System.out.println(y);
System.out.println("test ... ");
}
大功告成!!!
本人之前阅读过Spring v5.0.x 版本源码,并且做了详细的代码注释,需要的可以clone 下查看。
这篇文章主要介绍Spring 的源码编译过程,二者结合,完美。
https://gitee.com/frank_zxd/spring-framework-5.0.x-source
|