最近准备去学习一下spring源码,想要学习源码当然要先把源码的环境搞出来,本来觉得应该不复杂,结果两天来,下载了5个版本gradle,spring源码从5.0x尝试到master,终于构建成功了!刚完事就想到赶紧分享给也正在构建的小伙伴,那就开始吧。
一、环境准备
1、JDK版本选择
建议1.8版本以上,笔者的JDK版本
2、gradle下载安装
spring源码是基于Gradle构建的,所以当然要先配置gradle环境了。
( 1 ) 官方下载地址:services.gradle.org/distributio…
( 2 ) 这时候聪明的小伙伴就要问了,gradle那么多版本,我下载那个呀!这个要去你下载spring源码根目录gradle\wrapper下的gradle-wrapper.properties文件中进行查看。
比如笔者下载spring源码中gradle版本是4.1.1,所以下载该版本即可。这里其实下载bin版本就行,不过建议下载all版本,这个版本可以查看gradle源码。
( 3 ) 安装配置环境变量
1)下载后解压缩,新增系统环境变量: GRADLE_HOME
2)新增path : %GRADLE_HOME%\bin
3)验证gradle是否配置成功,输入 gradle -v
出现如图所示及表示安装成功。
3、spring源码下载
( 1 )可以去很多代码仓库下载源码,比如Github、Gitee、开源中国等。
笔者这里选择的是github,不为别的就想看看自己网速给不给力。网速不好的可以选择Gitee、开源中国的代码库。
源码下载地址: github.com/spring-proj…
进入页面选择5.0.x分支,这里要强调一下,网上很多教程说先Fork到自己库,再通过git地址下载,这里有一个问题,你不管git下载的哪个版本分支,gradle-wrapper.properties、build.gradle都会是一样的,所以一定要选择好分支版本后,通过zip下载。
4、idea版本 2020.1
二、配置
1、修改spring源码根目录gradle\wrapper\gradle-wrapper.properties文件,修改后配置如下
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#distributionUrl=https://services.gradle.org/distributions/gradle-4.4.1-bin.zip
distributionUrl=file:///D:/Gradle/gradle-4.4.1-all.zip
这样每次打开项目就不会从官网下载了,直接读取本地gradle。
2、在spring源码根目录build.gradle文件中添加阿里云镜像,添加后的文件如下:
头部位置
buildscript {
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}
maven{ url "http://maven.aliyun.com/nexus/content/repositories/jcenter"}
gradlePluginPortal()
maven { url "https://repo.spring.io/plugins-release" }
}
dependencies {
classpath("io.spring.gradle:propdeps-plugin:0.0.9.RELEASE")
classpath("io.spring.gradle:docbook-reference-plugin:0.3.1")
classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16")
classpath("org.asciidoctor:asciidoctorj-epub3:1.5.0-alpha.7")
}
}
搜索repositories
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}
maven{ url "http://maven.aliyun.com/nexus/content/repositories/jcenter"}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
3、打开idea,随便打开个项目,配置gradle
gradle user home :本地gradle仓库位置,建议配置下,默认会下载jar包到c盘
4、打开spring源码,用open打开即可
打开后配置下jdk,不然build.gradle会有地方报错。 file->project Structure (快捷键ctrl+alt+shift+s)
改为本地jdk
三、下载依赖
以上配置完成后,就可以点击刷新,下载依赖了。
因为spring依赖的包相当的多,所以这个过程可能会比较长,有实力的小伙伴可以搞一个科学上网工具。
下载完成后就可以进入最后一步、也是最麻烦的一步项目编译了。
四、项目编译
1、准备工作
打开spring源码根目录gradle/docs.gradle文件
注释掉dokka、asciidoctor代码块
因为spring源码是在linux系统上开发的,linux文件目录跟window是不一样的,所以需要修改task schemaZip这块代码,这里直接注释原代码,粘贴新的即可。
task schemaZip(type: Zip) {
group = "Distribution"
baseName = "spring-framework"
classifier = "schema"
description = "Builds -${classifier} archive containing all " +
"XSDs for deployment at http://springframework.org/schema."
duplicatesStrategy 'exclude'
//当前系统是否是windows的标志
def isWindows = System.properties['os.name'].toUpperCase().contains('WINDOWS')
//不同的操作系统,表示子目录的符号是不同的
def schemaPath = isWindows ? "META-INF\spring.schemas" : "META-INF/spring.schemas"
moduleProjects.each { subproject ->
def Properties schemas = new Properties();
subproject.sourceSets.main.resources.find {
it.path.endsWith(schemaPath)
}?.withInputStream { schemas.load(it) }
for (def key : schemas.keySet()) {
def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')
assert shortName != key
File xsdFile = subproject.sourceSets.main.resources.find {
//如果是windows环境,就要对路径中的分隔符做替换
isWindows ? it.path.endsWith(schemas.get(key).replaceAll('\/','\\')) : it.path.endsWith(schemas.get(key))
}
assert xsdFile != null
into (shortName) {
from xsdFile.path
}
}
}
}
2、执行编译
其实spring源码有提供idea构建的文档,有兴趣的可以打开根目录下import-into-idea.md 了解一下。
按照上面说的先编译spring-oxm
双击运行complieTestJava 执行编译的过程中,可能由于网络问题导致失败,重新执行即可。
3、去掉spring-sapects 模块
笔者是去除了spring-sapects 模块的,有一些文档也说不用去除,不过还是建议去除。
4、编译spring-core
双击运行complieTestJava进行编译
恭喜 你又离成功近了一步。
5、全局编译
这个编译的时间可能会比较慢一些,不要着急,喝点咖啡,刷会微博,耐心等待肯定会成功的。
如果成功了,恭喜你,已经基本完成了spring源码的构建,接下来简单测试下是否真正成功了
五、测试
新建模块 File -> New -> Module
选择Gradle项目,然后next
新建完成后,打开新模块目录下的build.gradle文件,添加依赖
dependencies {
compile(project(":spring-beans"))
compile(project(":spring-core"))
compile(project(":spring-aop"))
compile(project(":spring-context"))
testCompile group: 'junit', name: 'junit', version: '4.12'
}
1)在模块下新建配置类BaseConfig
2)新建类X
3)新建测试类
运行测试类main方法
成功输出X类构造方法和hello方法。
到这里为止,恭喜你已经成功构建出spring源码学习环境