对于想深入研究spring源码的,肯定会下载源码运行调试。那就得搭建环境。
下面记录下搭建环境过程以及遇到的坑。
注意:一定要注意版本一致性!
版本工具
版本工具:Spring5.0.4.RELEASE,gradle4.9bin,jdk1.8.0,Intellij IDEA
1、spring源码下载
下载spring源码,可以从spring官方的github库中进行下载。
spring各个版本的下载链接。下载地址
由于GitHub地址下载慢,这里提供本次编译的源码下载地址。
链接:百度云
提取码:djmy
2、gradle4.9下载
链接: 官网下载地址
链接:百度云
提取码:cknc
3、jdk下载
jdk各个版本下载地址
https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
本次使用jdk下载地址
链接:百度云
提取码:s3rp
搭建过程
配置jdk
可以选择自己的版本
配置过程: JDK安装与环境变量配置
配置gradle
根据源码确定gradle的版本
打开你spring源码的目录gradle\wrapper\gradle-wrapper.properties查看。
下载解压可以看到如下目录结构
1、在系统变量中新建变量
GRADLE_HOME
2、GRADLE_USER_HOME
3、编辑Path,加入路径如下图所示,点击保存
4、验证是否配置成功,进入cmd后,输入gradle -v,显示如下 环境配置
5、打开文件夹->新建文件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
}
}
}
源码
先配置源码保存版本一致性和提高下载速度
1、编辑源码根目录下的build.gradle
先查看版本号
修改文件
2、源码下配置远程仓库
根目录下的build.gradle:
添加信息
maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
Idea配置编译
导入IDEA
1、打开源码中import-into-idea.md文件
操作步骤:
File -> New -> Project from Existing Sources -> 找到选择spring-framework源码 -> 选择build.gradle
2、配置idea
配置本地gradle
使用工具编译时,可能会出现内存溢出情况,这里我们编译时需要增加相关参数
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
以上工作完成之后,我们可以开始编译配置
项目编译顺序:core-oxm-context-beans-aspects-aop
开始编译
遇到各种问题以及解决方案
1、Circular dependency between the following tasks
解决方案:修改spring-beans.gradle
将 spring-beans.gradle 最后三行替换成:
def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues
compileGroovy.dependsOn = deps - "compileJava"
compileKotlin.dependsOn(compileGroovy)
compileKotlin.classpath += files(compileGroovy.destinationDir)
2、Gradle打包问题Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0
打开gradle-wrapper.properties
修改gradle版本
点击build的刷新按钮,重新build
3、找不到InstrumentationSavingAgent
找到引入InstrumentationSavingAgent所在模块的地方。spring-context.gradle
把optional修改为compile。下图就是修改后的效果。再重新build。
4、修改docs.gradle文件
打开文件spring\gradle\docs.gradle
注释掉dokka和asciidoctor两个配置项,主要用来生成文档的。
替换docs.gradle文件中的task schemaZip配置,在windows环境需要替换成""。
将原来的 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'
moduleProjects.each { subproject ->
def Properties schemas = new Properties();
subproject.sourceSets.main.resources.find {
it.path.endsWith("META-INF\\spring.schemas")
}?.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 {
it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\'))
}
assert xsdFile != null
into (shortName) {
from xsdFile.path
}
}
}
}
测试源码
等待编译完成。
测试项目是否可用。
在源码项目new一个moudle,类型为gradle的管理的java项目即可
项目创建完成后,目录以及结构如下。
该项目下build.gradle添加compile project(":spring-context")
SpringConfig
TestDao
测试结果
运行Test.java,出现下图即证明spring5项目编译成功!