源码学习的第一步:Spring源码编译
前期准备准备工作:
1、本机安装并配置好了git
2、本机安装并配置好了jdk,且jdk的版本至少是1.8
3、本机安装并配置好了 gradle,gradle也可以先不用安装配置,我这里是提前配置好的,版本是:6.8.3
备注:Gradle,也可以不用安装,在编译的时候根据源码提示按照对应版本的Gradle即可
4、Idea
前期工作准备完之后,开始进入正题:
一、获取Spring源码
推荐使用clone的方式将源码拉取到本地,最大的好处在于可以利用IDEA直接比较版本间的差异;如果下载zip包然后解压 进行编译可能会出现各种各样的问题
1、在任意磁盘路径下新建一个文件夹,名称随便取,如:spring_source_code
2、进入spring_source_code文件夹中,打开git命令行,输入以下命令:
使用github(国外服务器,克隆较慢)时,输入:
git clone https://github.com/spring-projects/spring-framework.git
使用gitee(国内服务器,克隆比较快,推荐使用),输入:
git clone https://gitee.com/mirrors/Spring-Framework.git
在gitee中选择版本,如下图所示:
代码克隆(克隆完成后如下图所示):
二、添加阿里云镜像
在编译过程中,Spring会去自动下载一些依赖的包,默认使用的是官方的镜像,下载比较慢,所以我们提前添加好国内镜像,将下面这行代码粘贴到build.gradle文件中的repositories节点、以及settings.gradle文件中的reponsitories节点 下即可
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
记住是两个文件 !!!
代码如下:
build.gradle文件 :
repositories {
maven { url "https://maven.aliyun.com/repository/public"}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
settings.gradle文件 :
pluginManagement {
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
}
}
注意:把maven { url “http://maven.aliyun.com/nexus/content/groups/public” } 这个配置放在最上面
三、预先编译spring-oxm模块
进入到下载好的代码的根路径中,打开命令行窗口,并切换到源码所在文件夹,执行以下命令
gradlew :spring-oxm:compileTestJava
回车,开车执行;
出现BUILD SUCCESS字样时说明构建成功,如下图所示
此时需要注意:如果出现了“BUILD SUCCESS”,但是也出现了上图中的最后一行代码,只需要做以下操作即可:
打开settings.gradle,注释掉:id “io.spring.ge.conventions” version “0.0.7” 这一行即可,如下图所示:
注释掉之后,再重新进入cmd执行:gradlew :spring-oxm:compileTestJava
出现“BUILD SUCCESS”之后,如下图所示:
至此,编译成功!!!
四、根据编译后的源码下载并安装对应的版本的Gradle
在完成对spring-oxm模块的编译后,会在当前目录生成一个.gradle文件夹,打开后可以查看对应的Gradle版本。
双击打开.gradle文件夹就能看到对应所需要的gradle的版本号
可以在这个网站上下载对应所需要的版本即可:https://gradle.org/releases/
安装好后记得配置Gradle的环境变量
新增 GRADLE_HOME 环境变量,指向Gradle解压目录
配置Path环境变量:新增 %GRADLE_HOME%\bin
之后测试是否安装成,在命令行中输入以下命令:gradle -v,查看是否正确输出了对应版本,如下图所示:
五、为安装好的Gradle配置国内镜像
进入Gradle安装目录,在init.d目录下新建一个init.gradle文件,并添加以下内容:
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
def url = repo.url.toString()
if ((repo instanceof MavenArtifactRepository) && (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com'))) {
project.logger.lifecycle 'Repository ${repo.url} replaced by $REPOSITORY_URL .'
remove repo
}
}
maven {
url REPOSITORY_URL
}
}
}
如下图所示:
六、将代码导入到IDEA中
七、构建整个项目
如果事先在idea中配置了gradle,idea会自动识别这是一个gradle项目,紧接着idea会进行自动构建;
idea构建的过程,时间比较,可以耐心等待一下;构建过程中会下一系列的jar文件 ,比较耗时的jar文件是:guave-28.2-jre-sources.jar;
导入idea成功,如下图所示:
八、添加模块进行测试
右键工程名 —> new —> module
选择Gradle及Java
输入模块名称
点击next —> Finish 完成测试模块的创建
最后,添加一些必要的依赖,修改创建好的模块中的build.gradle文件,添加依赖(按需添加,这里是做测试的,先添加spring-context的依赖)
compile(project(":spring-context"))
如下图所示:
到这里,就完成了整个spring的编译,并且创建了一个以后学习使用的新模块!!!
备注:在使用git clone https://gitee.com/mirrors/Spring-Framework.git 克隆代码时,拉取的是主分支(master分支)的内容,如果想切换成其它版本,可以在切换到其它版本,也可以不切换,不切换其它分支不会影响spring源码的学习!!!
如果切换spring源码的分支(以idea为例),可以参考如下图所示内容:
按照以上三个步骤就可以检出相对应的分支!!!