源码包下载

基于Spring v5.2.0RELEASE, 访问下述地址就能下载到源码包, 解压后(解压路径最好别包含空格和中文), 查看gradle目录下的相关信息, 能查到Spring5.2.0版本是用gradle 5.6.2进行打包的。

Spring源码下载

1
https://github.com/spring-projects/spring-framework/archive/refs/tags/v5.2.0.RELEASE.zip

gradle安装

实际上更为方法的做法是使用gradlew(gradle wrapper)命令, 这样可以不用自己本地安装gradle, 而可以根据项目的wrapper.properties配置文件指定gradle.zip来自行下载这个项目需要的对应版本的gradle, 相关依赖会被保存在c盘/用户/.gradle下。而我这里的做法是配置一个本地gradle并在idea中自定义gradle配置。

访问以下地址进行下载

1
https://services.gradle.org/distributions/gradle-5.6.2-bin.zip

解压并配置环境变量

gradle配置

验证配置gradle安装成功


配置镜像源(本地仓库没有依赖时的重要配置):gradle-5.6.2/init.d/ 目录下, 创建init.gradle, 并添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
}
}
}

Spring源码的gradle配置

首先替换源码根路径下的build.gradle文件中respositories为阿里的, 需要配置以下2个地方。

1
2
3
4
5
6
7
8
buildscript {
// ...
// 添加这一块内容...
repositories{
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
}
1
2
3
4
5
6
7
8
9
10
dependencyManagement {
// ...
// 修改这一块
repositories {
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
}

导入idea

参考: https://github.com/spring-projects/spring-framework/blob/main/import-into-idea.md

预编译!!!

1
gradle :spring-oxm:compileTestJava

预编译成功

预编译完成后, 直接open Spring源码文件夹即可, 然后在右下角把正在加载的过程给cancel, 然后去Settings中配置gradle。

idea配置本地gradle

然后重新点击Reload All Gradle Project即可开始下载依赖到idea配置的gradle user home文件夹下

idea重新加载项目

重新加载完成后, 右侧Gradle栏目就会显示Spring源码的各个模块了, idea也开始Updating Indices.

项目gradle资源reload成功

最后进行项目build

Spring源码build成功

测试

我们可以在spring-core等模块的同级, 创建一个my-spring-test的模块(注意是gradle项目), 并引入spring-core进行测试.

引入内部模块依赖

1
2
3
4
5
6
7
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'

compile(project(":spring-core"))
compile(project(":spring-context"))
compile(project(":spring-beans"))
}

进行测试(过程中如果乱码, 可以加上启动参数-Dfile.encoding=utf-8)

测试成功

Spring源码安装到maven本地仓库

将本地安装的maven的settings.xml复制到c盘/用户/.m2文件夹下, 里面配置有maven本地仓库的位置, 不然gradle项目publish的jar会放到maven仓库默认路径下面。

然后在publishToMavenLocal之前把之前加的-Dfile.encoding=utf-8参数去掉, 不然会报如下错(在源码上加注释再publish, 也会导致报别的一些错…, 这个没解决得了)

1
Execution failed for task ':spring-beans:javadoc'. > Javadoc generation fail

直接spring > Tasks -> publishing > publishToMavenLocal会报一个> Task :asciidoctor FAILED的错, 但是spring的子模块都能通过publishToMavenLocal直接安装到maven的本地仓库.

gradle项目install到maven本地仓库

Spring添加注释并支持调试

我们可以直接把maven本地仓库的spring-context-5.2.0.RELEASE-sources.jar解压, 然后按照如下方式在idea中配置。

我们对于一个引入了spring-context模块的maven项目进行如下操作进行替换源码包

项目中替换源码包

下面进行调试测试

替换源码包尝试修改注释

另外可以选择将写好注释的文件直接把spring-context-5.2.0.RELEASE-sources.jar中的文件给替换掉的方式, 这样就不用每个项目都配置一遍源码包了。

实际上其他jdk源码等都能通过这种方式进行添加注释, 这种方式替换源码也是最方便的。