写在前面
- 很多人想学习源码,或者在b站、慕课网等跟着视频学习源码的时候,想跟着调试,注释spring源码。但是很多时候配置不好环境,这样学习效率不高,心里也很不爽,打击学习积极性。
- 本篇文章主要是本地搭建spring源码环境,我也参考了很多博客以及官方文档,此处主要是想写一篇能够稳定实现本地编译源码的环境,避免很多初学者走弯路。
1、下载spring源码
使用下载地址(windows本地配置git就不说了):
git clone https://gitee.com/mirrors/spring-framework.git
说明
- 很多人说要稳定版本,我直接用上面连接git下来,一般是最新版本,照样可以用,这里如果只是用来自学,没什么问题。
2、配置本地gradle
- 有两种方法:
1、手动下载gradle二进制包,这个就不细讲,google、百度随便一下就有完整教程,大致说一下步骤:
- 点击下载gradle releases版本,也有文章说要4.几的稳定版本版本,我就用最新的,没问题!!!
- 配置GRADLE_HOME、GRADLE_USER_HOME环境变量,并添加到path中去
- (建议)提前打开idea把gradle配置好,这里我先不说怎么配,因为第二个方法才是我推荐的。
2、(推荐)使用Scoop下载和管理gradle
推荐原因
1、可以随时把gradle更新到最新版本,方便管理。
2、可以像在Linux环境下一样下载东西,类似python的pip
3、执行一个命令就ok。不需要手动下载二进制包
操作说明
1、首先安装Scoop。
ps:打开windows power shell(这个时候不得不推荐丢弃windows自带命令提示符(就那个windows R + cmd),在windows应用商城搜索windwos Terminal,更好用)
- 到scoop github地址上面有安装说明
如下:
1、powershell给当前账号赋予执行下载命令的权限:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
2、指定scoop的安装位置(是两行命令)
$env:SCOOP='D:\Applications\Scoop'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')
3、指定scoop下载软件的位置
$env:SCOOP_GLOBAL='F:\GlobalScoopApps'
[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')
4、下载scoop
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
# or shorter
iwr -useb get.scoop.sh | iex
5、下载aria2,官方说明:
Scoop can utilize aria2 to use multi-connection downloads. Simply install aria2 through Scoop and it will be used for all downloads afterward.
也就是帮助你在使用scoop的时候下载加速
- 如果下载很慢还是先搞个梯子把这个下载了,后面就不管了
scoop install aria2
2、下载gradle和配置(如果你按照上述执行完毕,在下载完aria2之后会看到绿色的下载完成的命令提示)
1、使用scoop下载gradle(一般会下载最新版本)
scoop install gardle
接着等着下载完成。就这么简单,爽不爽,反正我用了只有真香,后面还有:
2、把gradle更新到最新版本:
scoop update gradle
这时候会提示gradle已经是最新版本。
这里有一个需要说明的是,我配置好了scoop下软件安装的位置,然而还是没有按照我的目录安装,反而是安装在scoop的子目录下:
===================================分隔符====================================
3、这个时候在配置gradle的环境变量,同方法一所说的三步。我自己配好的结果如下:
到这里我们整理一下:1、spring源码下载好了,gradle安装好了(注意:并不是配置好了)
4、配置gralde的镜像仓库,在gradle的根目录下--->init.d目录----->点进去----->创建一个名为init.gradle的文件
在文件中添加如下json格式的maven镜像仓库路径
allprojects {
repositories {
maven {
url "https://maven.aliyun.com/repository/public"
}
maven {
url "https://maven.aliyun.com/repository/jcenter"
}
maven {
url "https://maven.aliyun.com/repository/spring"
}
maven {
url "https://maven.aliyun.com/repository/spring-plugin"
}
maven {
url "https://maven.aliyun.com/repository/gradle-plugin"
}
maven {
url "https://maven.aliyun.com/repository/google"
}
maven {
url "https://maven.aliyun.com/repository/grails-core"
}
maven {
url "https://maven.aliyun.com/repository/apache-snapshots"
}
}
}
ctrl + s之后,基本上ok了,检验gradle安装好的办法就是:命令行执行如下命令,查看是否安装好
gradle -v
接下来我们需要配置idea的gradle
3、配置idea的gradle
- 打开已有工程,如果是已有的gradle工程最好(既然前面gradle都教你配置了,肯定默认你没有gradle工程,从头来) 1、 首先我们要新创建一个gralde工程,new---》project,进行如下选择:
阿里镜像路径:
https://start.aliyun.com
2、 紧接着,下一步,选择gradle项目:
后面跟着默认随便创建就好了,只是用来配置gradle
3、 创建好之后,在idea的右侧,点击gradle图标:
4、 进入gradle设置页面
通过以上配置前期准备就完成了,下一步可以编译本地spring源码了。
编译spring源码(我这里只讲命令行编译的,不踩坑)
1、先把坑填了
在spring源码目录下除了源码部分,还有有这么几个文件和事情需要我们注意:
- gradle目录
- gradlew.bat windows批处理命令
- 在spring-oxm目录中有一个编译命令叫:gradlew :spring-oxm:compileTestJava
不管是命令行编译还是idea编译,在执行编译命令的时候,不管你本地有没有gradle,命令行都会执行下载gradle。
这个时候通常由于网络的原因,都会下载失败,很多人都卡在这一步(各种网络原因timeout):
下面填坑
- 既然要下载,那我就先给你下载好。
- 打开gradle目录下的wrapper目录下的gradle-wrapper.properties文件
查看此时配置中会下载什么版本的gradle,然后我们到最开始给的gradle网站去下载对应的gradle二进制包,解压到没有中文的目录下(!!!!注意一定是没有中文) 然后再把配置中的下载路径改为本地的(我个人的配置):
distributionUrl=file\:///D:/PRO-gradle/spring-framework/gradle/wrapper/gradle-6.7.1-bin.zip
其中: D:\PRO-gradle\spring-framework\gradle\wrapper是我放自己下载gradle的本地路径
到此,坑填了
2、编译代码
1、打开windows Terminal,然后cd 到spring源码目录下,即:D:\PRO-gradle\spring-framework>(我自己的源码目录)
2、执行预编译命令:
gradlew.bat
当出现如下图所示,显示编译成功时,即证明编译成功
3、为了保险起见,再执行一下命令(与spring-oxm目录下的内容对应):
gradlew :spring-oxm:compileTestJava
如果上述两部都执行成功,即编译成功,接下来,导入idea
3、导入idea
- 按照官网所说,需要new--->project from existing sources方式进行导入
-
进入到如下界面:
-
然后按照之前idea中配置的gradle那样,检查一下gradle是否是之前配置好的内容,如果不是,及时改成正确的。
这时idea会本地加载,一般要不了多久,下面,讲一下本地调试
4、本地调试
1、在当前工程创建一个module
2、创建一个gralde module
后面自己喜好配置
3、在build.gradle中添加如下内容:
compile(project(":spring-context"))
4、创建如下三个类:
1、配置类,添加扫描范围
- 注意扫描范围根据自己创建的包路径来,一开始不会自动导入ComponentScan和Configuration不要着急,也不要去做任何瞎操作,一步一步来
package com.self.learn.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.self")
public class AppConfig {
//扫描com.self包下面的所有bean
}
2、添加一个bean
@Component
public class IndexService {
public IndexService() {
System.out.println("初始化IdenxService");
}
}
3、添加测试类
public class MyTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(ac.getBean(IndexService.class));
}
}
OK,大功告成,如果上述没法根据提示导入spring对应包和类,直接运行gradle编译几遍,然后,就可以导入了
总结
- 完全小白操作了,跟着这个编译,因该没有任何问题,然后就可以debug,修改本地注释了😁