版本:5.2.19 前置条件:
- JDK11
- git
- IDEA
仅保证对于此环境有效,jdk可以安装多版本,或者可以用其他版本尝试一下。 如果不纠结想快速搭建环境,可以按照步骤一步步来,没必要在搭建环境的环节上浪费时间。 本教程使用于 MacOs 和 Windows 教程中用到的相关文件自取:链接:https://pan.baidu.com/s/1BxiC1WPoyk47C6_bSC3CHQ 提取码:dp5d
1. 拉取代码
因为GitHub现在速度较慢,所以直接选用码云上的代码,https://gitee.com/mirrors/Spring-Framework,分支选择 5.2.x
可以用git clone,但因为我们也不需要切换分支和查看git记录,这里建议直接下载zip包,这样也方便我们搭建失败的话,解压直接重新开始就可以。也可以在文章开头的网盘中直接下载。
2. 修改配置文件
2.1 build.gradle
修改项目根目录下的 build.gradle 文件。可以直接用网盘中的文件替换,也可以按照下面步骤修改。
加上阿里云的镜像地址,将圈出来的修改为如下,加速我们拉取依赖。
repositories {
maven { url "https://maven.aliyun.com/nexus/content/groups/public/"}
maven { url "https://maven.aliyun.com/nexus/content/repositories/jcenter"}
maven { url "https://repo.spring.io/libs-spring-framework-build" }
maven { url "https://repo.spring.io/snapshot" } // Reactor
maven { url "https://oss.jfrog.org/artifactory/oss-snapshot-local" } // RSocket
}
2.2 gradle-wrapper.properties
修改 Spring-Framework-5.2.x\gradle\wrapper\gradle-wrapper.properties
文件如下
我们比较熟悉的构建工具是 Maven,我们需要在自己的开发电脑上安装 maven,然后在 IDEA 里面配置 maven 路径。
但 Spring 是使用 gradle 构建的,可能是因为 gradle 打包大型项目速度快很多,不重要。
但我们在最开始并没有说我们需要 gradle 环境。玄机就在这里,当我们用 IDEA 导入项目之后,项目会自动从我们配置的地址中去下载 gradle 压缩包,然后进行解压等操作,帮我们把 gradle 环境搭建好。配置文件中 distributionUrl 就是这个下载的地址,默认的地址 https://services.gradle.org/distributions/gradle-5.6.4-bin.zip 我们可以去下载,但 IDEA 去下载可能会失败,所以我们把这个地址改成本地的,让他从我们本地下载,基本上就不会失败了,除非你路径写错了。
我的电脑路径是
C:\dev\gradle-5.6.4-bin.zip
windows 改成
file\:///c\:/dev/gradle-5.6.4-bin.zip
3. 导入 IDEA
先随便打开一个项目,进设置看下 git 有没有配置
开始导入,点击 open 选择文件夹
进去后会先看到这个提示,证明gradle下载成功了
趁着项目编译的时候,我们把JDK配置改了
打开 Project Structure,修改为圈出的选项
还有gradle的配置
构建的时间会比较长,我们先等待这边转完就行
这时候我们会先看到一个git报错
这个是因为我们是下载的 zip 包,没有 git 文件,我们依次运行一下 git 命令就可以就可以
git init
git add --all
git commit -m 'first commit'
然后我们等待打包结束,能看到如下提示
还是提示git的问题,因为我们已经解决了,我们直接再构建依次看下
这时候我们能看到构建已经成功了
看着成功了,但其实还没有,我们继续往下看。
3. 创建自己的 module
注释掉原有的依赖,加上 spring-context 依赖,我们去测试一下
optional(project(":spring-context"))
然后我们刷新一下构建
等待构建完成,我们去写测试代码
注意,如果有别的错误,见文末
4. 编写测试代码
名称随意
代码如下
package com.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext
context = new AnnotationConfigApplicationContext();
context.refresh();
}
}
执行 Run 命令
首先出现 Kotlin: warnings found and -Werror specified
这个错误
这个是因为 kotlin 会把 warning 当做 error 来处理。这个其实是允许的,这时候我们修改 build.gradle 文件中的如下配置,把 allWarningsAsErrors = true
注释掉。
重新构建下。然后继续运行刚刚的 main 方法。
可能会遇到如下错误(如果是别的错误,见文末)
其实是没有 class 文件,我们可以运行对应模块的 Test 方法,让其编译出 class 文件。
跑完会弹出一个提示,不用管,因为这个包下面其实是没有测试类的,我们的目的也是为了编译 class 文件,有没有测试类无所谓。
然后我们重新跑我们自己模块的 main 方法,这时候会出现这个提示。
解决思路和刚刚是一样的,因为这个类是 context 里的,那我们找一个 context 里面的测试包去跑
跑完提示是和刚刚一样的,我们再去执行 main 方法,发现已经可以正常运行了。
补充错误
当我们改完Kotlin: warnings found and -Werror specified
这个错误之后,可能运行 main 方法还会遇到另一个错误 :程序包org.springfeamework.cglib.core.internal不存在
。
这时候我们去运行core里面的一个gradle插件方法
运行完就会遇到上面别的错误。一步步解决就行了
完
可以开始愉快的学习 Spring 源码,通过修改源码验证我们的各种猜想。
教程来源于子路老师的课程