共计 3201 个字符,预计需要花费 9 分钟才能阅读完成。
源码学习第一步,Spring 源码编译
之所以写这么一篇文章是因为群里的小伙伴在编译源码时碰到了问题,再加上笔者自身正准备做一个源码的注释版本,恰好也需要重新编译一份代码,至于为什么要将源码编译到本地就不用多说了吧?
比如,你可以任意的添加注释,一边读源码一边记笔记,甚至你可以修改源码,更好的调试程序等等。但是如果你坚持通过导入依赖或者引入 jar 包的方式来学习源码,我觉得也可以,没有最好的,只有最适合自己的!
本文的主要目的是帮助那些在源码学习之初就被源码编译劝退的同学重拾信心!
话不多说,我们开始正题
参考官方文档:
https://github.com/spring-pro…
https://github.com/spring-pro…
前期准备
- 确保本机已经安装好了
git
-
jdk
对应版本为 1.8
-
Gradle
,目前不需要安装,在编译的时候根据源码提示按照对应版本的Gradle
即可 -
IDEA
,我使用的版本如下:
1、获取 Spring 源码
这里我推荐使用 clone 的方式将源码拉取到本地,最大的好处在于可以利用 IDEA 直接比较版本间的差异,例如
在上图中我本地编译的 5.0
版本的代码,所以我对比的是 5.0
跟5.1
版本 populateBean
方法实现的差异。
接下来我们开始拉取 Spring 源码,大家可以按照以下几步进行
- 在任意磁盘路径下新建一个文件夹,名称随便取,建议为
SpringFramWork
- 进入
SpringFramWork
文件夹中,打开git
命令行,输入以下命令
git clone https://github.com/spring-projects/spring-framework.git
接着等待仓库克隆完毕,这个过程可能会耗费比较长的时间,如果实在不行的话,大家可以直接将源码的压缩包 down 下来。
如果你是跟我一样直接拉取的代码,记得切换到 5.2.x
版本,在命令行中执行命令:
git checkout origin/5.2.x
2、添加阿里云镜像
在编译过程中,Spring 会去自动下载一些依赖的包,默认使用的是官方的镜像,下载比较慢,所以我们提前添加好国内镜像,将下面这行代码粘贴到 build.gradle
文件中的 repositories
节点下即可,
// 添加阿里云镜像
maven {url "http://maven.aliyun.com/nexus/content/groups/public"}
如下图所示
3、预先编译 spring-oxm 模块
打开命令行窗口,并切换到源码所在文件夹,执行以下命令
gradlew :spring-oxm:compileTestJava
出现 BUILD SUCCESS
字样时说明构建成功,如下图所示
4、根据编译后的源码下载并安装对应的版本的 Gradle
在完成对 spring-oxm
模块的编译后,会在当前目录生成一个 .gradle
文件夹,打开后可以查看对应的 Gradle
版本。
双击打开 .gradle
文件夹就能看到对应所需要的 gradle
的版本号
大家直接在这个网站上下载对应所需要的版本即可:https://gradle.org/releases/,选择 binary-only
安装好后记得配置 Gradle
的环境变量
- 新增
GRADLE_HOME
环境变量,指向 Gradle 解压目录 - 配置 Path 环境变量: 新增
%GRADLE_HOME%\bin
之后测试是否安装成,在命令行中输入以下命令:gradle -v
,查看是否正确输出了对应版本。
5、为安装好的 Gradle 配置国内镜像
进入 Gradle
安装目录,在 init.d
目录下新建一个 init.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}
}
}
如下图所示:
6、将代码导入到 IDEA 中
6.1、打开 IDEA 并选择导入项目
6.2、选择导入一个 Gradle 项目
6.3、配置导入的项目
点击 Finish
后等待 IDEA 构建完项目,如果你之前已经按照我的方法配置了 Gradle
的国内镜像,这个过程不会太久,我们本机只用了 10 多分钟就构建完成了
构建完成后整个项目结构如下:
如果你跟我一样是直接检出的代码,记得将分支切换到5.2.x
7、构建整个项目
选择 Build > Build Project
可能出现的问题
AnnotationCacheAspect 找不到符号
在这个过程中你可能会碰到如下错误:
这是因为 AnnotationCacheAspect.aj
不是 java 文件需要另外的aspectj
进行处理,可以按照以下步骤解决这个问题
-
下载
aspectj
,对应链接:https://www.eclipse.org/downl… - 安装
aspectj
打开命令行,cd 到 AspectJ 的 jar 包所在的文件夹,运行 java -jar aspectj-1.9.4.jar
命令,打开 AspectJ 的安装界面,直接点击 Next,如下图:
接着选择 jdk
的安装路径,继续 Next。
接着选择 AspectJ
的安装路径,然后 Install 安装。
- IDEA 中配置
aspectj
确保以下两个插件已经被激活
- Spring AOP/@AspectJ
- AspectJ Support
将编译器改为 Ajc,接着设置 Ajc 的安装目录,选择到 aspectjtools.jar, 同时,一定要将 Delegate to Javac 选项打钩,这个代理设置的作用只对指定的项目进行 Ajc 编译,其他的项目还是用默认的 javac 编译器编译。如果不勾选这个代理选项,则全部项目都使用 Ajc 编译器编译,可能会导致编译错误。
- 指定需要使用 Ajc 编译的项目
分别为 spring-aop
及spring-aspects
添加 Facets
属性。
点击 File –> Project Structure –> Facets,选择spring-aop.main
,点击 OK
点击 File –> Project Structure –> Facets,选择spring-aspects.main
,点击 OK
完成添加,如下图所示:
完成上述步骤后,再次选择Build > Build Project
,成功完成编译
8、添加测试模块
8.1、右键工程名 —> new —> module
8.2、选择 Gradle 及 Java
8.3、输入模块名称
点击 next —> Finish 完成测试模块的创建
最后,添加一些必要的依赖,修改创建好的模块中的 build.gradle
文件, 添加如下三个依赖
compile(project(":spring-aop"))
compile(project(":spring-context"))
optional("org.aspectj:aspectjweaver")
如下图所示:
至此,我们就完成了整个 Spring 的编译,并且在创建了一个日后学习使用的模块!
如果本文对你有帮助的话,记得点个赞吧!也欢迎关注我的公众号,微信搜索:程序员 DMZ,或者扫描下方二维码,跟着我一起认认真真学 Java, 踏踏实实做一个 coder。