本文是spring源码系列第一篇,计划通过10篇左右文章分析spring主要流程
工欲善其事,必先利其器。同样,学习Spring源码,就必须先把Spring的源码环境搭建起来
0 下载spring的源码
github中搜索spring-framework项目,直接git clone或者下载压缩包
1 编译源码
根据spring项目的md中编译指南
https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
1.1 执行./gradlew build命令
官方文档中有写到需要执行./gradlew build命令(linux环境),Windows中运行gradlew build
由于网络原因这个命令一般是执行不成功的。
spring源码使用gradle wrapper的方式进行构建,该命令的作用是下载gradle,然后指定该项目使用下载的gradle进行构建。命令执行完后会完成依赖的引入及源码的编译。
网络原因造成的失败可以通过以下方法解决,打开gradle/wrapper/gradle-wrapper.properties可以看到gradle的下载路径以及解压路径
可以先把对应的gradle版本下载下来,然后把gradle-wrapper.properties的distributionUrl改成本地路径
这个时候执行命令gradle是能正常下载了,但是一些依赖的下载很慢,可以在下载完gradle后结束命令的执行改完仓库镜像配置后再重新执行
修改gradle的配置
在C:\Users\用户.gradle\wrapper\dists\gradle-4.10.3-bin\31t79e2qsceia4mkbojplrgx\gradle-4.10.3\init.d
中创建init.gradle,该配置为修改gradle的中央仓库为阿里云仓库
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
def url = repo.url.toString()
if ((repo instanceof MavenArtifactRepository) && (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 }
}}
1.3 导入idea
1.3.1 执行./gradlew :spring-oxm:compileTestJava命令
该命令为编译spring-oxm项目
1.3.2 导入
File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle
1.4 idea创建自己的module
这和时候spring被成功导入到idea了,可以在创建一个module,module的配置文件(build.gradle)里里面引入spring-core,就可以对spring进行调试了
,如有需要还可引入其他依赖,贴一下我的build.gradle
plugins {
id 'java'
}
group 'org.springframework'
version '5.3.9-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
// https://mvnrepository.com/artifact/junit/junit
testImplementation group: 'junit', name: 'junit', version: '4.13.1'
// https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core
testImplementation group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
// https://mvnrepository.com/artifact/org.aspectj/aspectjweaver
implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.6'
// https://mvnrepository.com/artifact/javax.inject/javax.inject
implementation group: 'javax.inject', name: 'javax.inject', version: '1'
// https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api
implementation group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2'
optional("org.apache.logging.log4j:log4j-api")
optional("org.slf4j:slf4j-api")
//log 输出
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21'
implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.1.7'
implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.7'
// lombok
implementation group: 'org.projectlombok', name: 'lombok', version: '1.18.12'
//添加spring的依赖
compile(project(":spring-context"))
//主要是为了数据源 datasource
compile(project(":spring-jdbc"))
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.23'
//mybatis的核心依赖
implementation group: 'org.mybatis', name: 'mybatis', version: '3.5.5'
//mybatis和spring的插件包
implementation group: 'org.mybatis', name: 'mybatis-spring', version: '2.0.5'
}
test {
useJUnitPlatform()
}
这个时候spring源码的搭建已经完成了,但是之后的修改idea会使用gradle进行构建,gradle构建会非常慢,推荐改为idea构建,方式如下: