最近想了解一下spring源码,于是准备下载源码编译一下,中间踩了不少坑,记录一下
版本
spring:5.2.0-release
gradle:5.6.4
安装gradle
gradle是类似maven的项目构建工具。spring官方使用gradle进行项目的构建(相比maven能极大提高项目构建的速度),因此需要首先安装gradle.
安装步骤:
-
登录gradle官网下载指定的安装包
-
解压
-
设置环境变量
除了上述三个gradle变量以外,还要设置一个maven变量M2_HOME,否则gradle的build.gradle等配置文件中的mavenLocal()将会使用默认的maven仓库/user/用户名/.m2/repository
- cmd下使用命令gradle -v验证是否安装成功
- gradle根目录/init.d文件夹下新建文件init.gradle(更换镜像源,加快依赖下载速度)
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (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
}
}
}
编译Spring
-
github下载spring-framework-5.2.0-release并解压
-
编辑setting.gradle文件,更换镜像源
repositories { mavenLocal() maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://maven.aliyun.com/repository/spring' } }
-
编辑build.gradle文件,更换镜像源,共有两处需要修改
repositories {
mavenLocal()
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://maven.aliyun.com/repository/spring' }
}
- 修改根目录/grade/wrapper/gradle-wrapper.properties文件,设置使用本地gradle,不然每次编译会从网上下载gradle
-
spring官方提供了导入idea及编译的主要步骤,点击项目根目录import-into-idea.md文档进行查看
-
根据文档,使用powershell 控制台输入命令./gradlew :spring-oxm:compileTestJava预编译spring-oxm模块,同时保险起见,执行命令./gradlew :spring-core:compileTestJava预编译spring-core模块。出现build successful提示表示编译成功
-
打开idea,点击file->new->project from existing source,找到项目根目录,点击build.gradle文件,确定,即可导入idea
调试
由于spring是使用gradle进行构建的,所以新建项目进行调试时,也要使用gradle
-
按如下步骤新建一个gradle构建的项目
-
项目建好后,编辑该新建项目根目录下build.gradle.kts文件,添加依赖(要调试的模块)
-
项目结构
-
AppConfig
@Configuration @ComponentScan("com.ningque.spring") public class AppConfig { }
-
MyService
@Component public class MyService { }
-
测试类
public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MyService bean = applicationContext.getBean(MyService.class); System.out.println(bean); } }
观察 是否能正常打印对象地址,若能则表示调试成功