- 先去github或码云下载Spring源码,我这里直接fork一份到自己的github,然后从自己的github仓库拉clone
Spring官方代码地址: https://github.com/spring-projects/spring-framework 点右上角的fork
到自己的github找到刚才fork好的仓库(相当于直接把spring的官方仓库拷贝一份到自己仓库) , 找到地址,直接clone
git clone https://github.com/xiayuyuyu/spring-framework.git
等一段时间(有梯子的会稍快),没装git的自己装一波,课可以选择下载zip包解压配置gradle (不赘述)
- 进入刚才的spring-framwork文件夹下,
gradlew :spring-oxm:compileTestJava
进行编译 - IDEA导入源码, File->New->Project From Existing Sources, 选中spring-framework源码文件夹,点击OK,选择Import project from external model,选中Gradle,点击Finish
- 初次导入 慢慢等待编译完成,直到下面的Build看到,我这里是第二次Build所以速度比较快,一般第一次视网速,电脑配置而定,大约要20分钟左右
- 将自己项目与刚才编译好的源码相关联,此处可以采用2中方式
- 另外起一个项目,添加spring的依赖,然后更改项目的Project Structure,删除原有从maven仓库里导入的spring包和源码,添加自己刚才编译好的jar包和源码
- 就在此项目另外添加一个测试的module,强烈推荐这种方法, 优点: 不用2个项目切来切去! 点击File->New->Module…->Gradle->Java->Next
添加好的Module中,需要更改一下build.gradle 来添加依赖 compile(project(“:spring-beans”))
- 至此环境已经搭建完毕,代码只需要在source-code-test中编写,打的断点就能正常进入
可能遇到的错误
编译失败
Build file '/Users/leon/Documents/IdeaProjects/github/spring-framework/build.gradle' line: 15
An exception occurred applying plugin request [id: 'com.gradle.build-scan', version: '1.8']
> Failed to apply plugin [id 'com.gradle.build-scan']
> This version of Gradle requires version 2.0.2 of the build scan plugin or later.
Please see https://gradle.com/scans/help/gradle-incompatible-plugin-version for more information.
原因 gradle版本太高了 plugin1.8 gradle 用4.1-4.10 (如果gradle配置项选的是wrapper file方式,那就需要改gradle-wrapper.properties
自己新建的项目,build.gradle 出现虚线,并且在写测试用例的时候不能引入相关包,
出现这个问题是因为idea新建module默认的gradle配置文件名为build.gradle,需要手动改为${你的project.name}.gradle 因为官方的build.gradle 有这一行,此处一定要改,不然自己的module不能正确编译 ```groovy rootProject.children.find{ it.name == “buildSrc” }.name = “spring-build-src”
rootProject.name = “spring” rootProject.children.each {project -> project.buildFileName = “${project.name}.gradle” }
3. 根目录 build.gradle 文件报错,我这里报的是 DependencyResolveDetails 找不到,此处直接把 DependencyResolveDetails 删掉就行
```groovy
configurations.all {
// Check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, "seconds"
// Consistent slf4j version (e.g. clashes between slf4j versions)
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.group == "org.slf4j") {
details.useVersion slf4jVersion
}
}
}