Spring源码编译(以5.3.22版本为例)
参考作者:程序员七哥 https://www.bilibili.com/read/cv11704879/ 出处:bilibili
本项目环境版本介绍:
原spring源码地址:https://github.com/spring-projects/spring-framework/tree/v5.2.22.RELEASE
spring版本:5.2.22.RELEASE
gradle下载地址:https://services.gradle.org/distributions/gradle-5.6.4-bin.zip
gradle版本:5.6.4
idea版本:2019.3.3
jdk版本:1.8.0_221
-
修改Spring源码根目录下/gradle/wrapper/gradle-wrapper.properties,为防止网络不稳定,将gradle下载到本地后指定本地目录。
修改前:
distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-bin.zip
修改后:
distributionUrl=file:///D:/SourceCode/springdownload/gradle-5.6.4-bin.zip
-
修改远程仓库,在build.gradle和settings.gradle文件中添加阿里云地址
build.gradle修改前:
repositories { mavenCentral() maven { url "https://repo.spring.io/libs-spring-framework-build" } }
build.gradle修改后:
repositories { maven { url 'https://maven.aliyun.com/repository/public' } //阿里云 mavenCentral() maven { url "https://repo.spring.io/libs-spring-framework-build" } }
settings.gradle修改前
repositories { mavenCentral() gradlePluginPortal() maven { url "https://repo.spring.io/release" } }
settings.gradle修改后
repositories { maven { url 'https://maven.aliyun.com/repository/public' } mavenCentral() gradlePluginPortal() maven { url "https://repo.spring.io/release" } }
-
在根目录下预编译spring-oxm模块
./gradlew :spring-oxm:compileTestJava
-
在根目录下编译spring-core模块
./gradlew :spring-core:compileTestJava
-
导入IDEA
-
开始使用idea导入Spring源码,File -> New -> Project from Existing Souces…
-
选择 Spring 源码项目的目录,进而选择根目录当中的 build.gradle 文件导入
在一开始的时候,用的是最新的Spring版本,对应的gradle是7.2版本的。其中出现了Idea创建gradle项目后控制台编译报“org.gradle.api.artifacts.result.ComponentSelectionReason.getDescription()Ljava/lang/String;”错误,原因是gradle与idea版本不兼容,出现此问题的idea版本是2019.03,而gradle版本是7.2。解决办法就是下载了一个依赖低版本gradle的spring源码的发行版。
-
导入 idea 之后会开始自动构建、建立索引,这个过程也是很漫长,你只能等,我这边用了不到7分钟,看电脑性能;
-
关于报git相关的错误,只需将代码放到一个版本管理器中,报错便不会再出现。比如我当时阴差阳错地在自己的gitee上新建了一个代码仓库,然后将spring源码的整个项目放到仓库中后,git报错就不见了。
- 接下来我们对 idea 进行一些设置,不然每次 idea 运行都会通过 gradle 去编译运行。gradle 运行编译特别慢,需要改成idea自己编译运行.
说明一下,这里不是一定要改,但是如果你不改用默认的则会特别慢,改成idea快的不止一点点。编译完成后的源码文件在idea打开后的模块文件夹图标会发生变化。
-
新建测试模块
-
在根目录下新建module,选择gradle->java
-
建好项目之后再 gradle 的配置文件(build.gradle)中添加 spring 的依赖; 相当于你建了一个maven项目,在pom文件中添加spring的依赖;
implementation(project(“:spring-context”))
//ps:改完配置文件后,需要点击idea右下角的弹窗:use auto-import,或者直接在右侧的gradle中打开,右击项目会有一个Auto-Import的选项,勾上即可(如下第二张图)。开启自动导入,主要是方便修改依赖后无需手动Reimport。
-
-
写测试代码
package com.dazhu.spring.config; /** * @Author: zwb * @Date: 2022/8/18 * @Description: */ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("com.dazhu.spring") public class AppConfig { //扫描ccom.dazhu.spring包下面的所有bean }
package com.dazhu.spring.services; import org.springframework.stereotype.Service; /** * @Author: zwb * @Date: 2022/8/18 * @Description: */ @Service public class HelloService { public void hello(){ System.out.println("hello,dazhu"); } }
package com.dazhu.spring; import com.dazhu.spring.config.AppConfig; import com.dazhu.spring.services.HelloService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @Author: zwb * @Date: 2022/8/18 * @Description: */ public class DazhuSpringApplication { public static void main(String[] args) { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); HelloService helloService = ac.getBean(HelloService.class); helloService.hello(); } }