之所以写这么一篇文章是因为群里的小伙伴在编译源码时碰到了问题,再加上笔者自身正准备做一个源码的注释版本,恰好也需要重新编译一份代码,至于为什么要将源码编译到本地就不用多说了吧?

比如,你可以任意的添加注释,一边读源码一边记笔记,甚至你可以修改源码,更好的调试程序等等。但是如果你坚持通过导入依赖或者引入jar包的方式来学习源码,我觉得也可以,没有最好的,只有最适合自己的!

本文的主要目的是帮助那些在源码学习之初就被源码编译劝退的同学重拾信心!

话不多说,我们开始正题

参考官方文档:

https://github.com/spring-projects/spring-framework/wiki/Build-from-Source

https://github.com/spring-projects/spring-framework/blob/master/import-into-idea.md

前期准备

  1. 确保本机已经安装好了git

  2. jdk对应版本为1.8

  1. Gradle,目前不需要安装,在编译的时候根据源码提示按照对应版本的Gradle即可

  2. IDEA,我使用的版本如下:

1、获取Spring源码

这里我推荐使用clone的方式将源码拉取到本地,最大的好处在于可以利用IDEA直接比较版本间的差异,例如

在上图中我本地编译的5.0版本的代码,所以我对比的是5.05.1版本populateBean方法实现的差异。

接下来我们开始拉取Spring源码,大家可以按照以下几步进行

  1. 在任意磁盘路径下新建一个文件夹,名称随便取,建议为SpringFramWork

  2. 进入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/downloads/download.php?file=/tools/aspectj/aspectj-1.9.5.jar

  • 安装aspectj

打开命令行,cd到AspectJ的jar包所在的文件夹,运行java -jar aspectj-1.9.4.jar命令,打开AspectJ的安装界面,直接点击Next,如下图:

接着选择jdk的安装路径,继续Next。

接着选择AspectJ的安装路径,然后Install安装。

  • IDEA中配置aspectj

确保以下两个插件已经被激活

  1. Spring AOP/@AspectJ

  2. AspectJ Support

将编译器改为 Ajc,接着设置Ajc的安装目录,选择到aspectjtools.jar,同时,一定要将Delegate to Javac选项打钩,这个代理设置的作用只对指定的项目进行Ajc编译,其他的项目还是用默认的javac编译器编译。如果不勾选这个代理选项,则全部项目都使用Ajc编译器编译,可能会导致编译错误。

  • 指定需要使用Ajc编译的项目

分别为spring-aopspring-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的编译,并且在创建了一个日后学习使用的模块!

听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译相关推荐

  1. 1.开篇(听说你还在艰难的啃react源码)

    人人都能读懂的react源码解析(大厂高薪必备) 1.开篇(听说你还在艰难的啃react源码) ​ 本教程目标是打造一门严谨(严格遵循react17核心思想).通俗易懂(提供大量流程图解,结合demo ...

  2. Spring IOC 容器源码分析系列文章导读 1

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  3. C语言已经自学完了,数电模电电路都还没学,学stm32会有阻碍吗

    C语言已经自学完了,数电模电电路都还没学,学stm32会有阻碍吗 起初就是学个c语言,跟着郭天祥视频进修,一通开发.大一的电路知识仅限于欧姆定律,电容滤波,二极管正向导通这样吧.但也搞得红红火火地,感 ...

  4. 单表带换密码C语言程序,帮忙写个C语言程序!题目在下面!关于链表的。还没学,题目:“建立一个链表,逐个输入字符,每一个字符存放在一个链。...

    帮忙写个C语言程序!题目在下面!关于链表的.还没学,题目:"建立一个链表,逐个输入字符,每一个字符存放在一个链. Posted By : Admin 2016-05-16 21:16 网友问 ...

  5. 跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期)

    跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期) 简介 Bean 元信息来源 Bean 元信息解析成 BeanDefinition 并注册 BeanDefinition 转变成 ...

  6. 跟着小马哥学系列之 Spring IoC(源码篇:@Import)

    跟着小马哥学系列之 Spring IoC(源码篇:@Import) 简介 @ Import 简介 元信息 元注解 属性 @Import 注解 value 属性取值范围 ImportSelector I ...

  7. Spring IOC 容器源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

  8. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  9. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...

最新文章

  1. 3W法—what,why,how的运用
  2. php smarty 时间,smarty的时间格式-详细 | 时刻需
  3. c语言怎么在编码时改变颜色,怎么给贪吃蛇换一个颜色 怎么改 代码如下
  4. Feature Extractor[DenseNet]
  5. Debian Linux 的 vim 如何使用系统剪贴板
  6. 基于FlashPaper的文档播放器
  7. php laypage,layui laypage组件常见用法总结
  8. CSS 属性篇(四):Flex弹性盒子
  9. 好文要顶之 --- 简单粗暴地理解 JavaScript 原型链
  10. oracle 基本dos命令,Oracle 常用 Dos命令
  11. eclipse中导入jar包源文件
  12. 大数据学习入门看什么书?大数据新手怎么入门?
  13. 电脑出现问题,你的PIN不可用。请单击以重新设置。
  14. jmeter ramup设置_Jmeter(2)基础知识
  15. 饱和度,对比度,锐度
  16. 政府部门服务器拒收邮件 怎么办,hotmail 邮箱最近反映拒收邮件,请问怎么解决?...
  17. float 精度探究
  18. 一对一家教如何辅导_大学生家教一对一上门辅导有用吗 收费标准是怎样的
  19. 纯CSS+HTML+JS实现的简易个人网站
  20. Failed to install metadata com.weiwen.common:weiwen-common-core/maven-metadata.xml: Could not parse

热门文章

  1. Day 13: Dropwizard —— 非常棒的Java REST服务器栈
  2. 广西发布品牌“出海”三年行动计划 布局海外市场
  3. Nagios安装部署与Cacti整合文档超精细版本
  4. Exchange 2007 迁移 2010
  5. Android View体系(三)属性动画
  6. linux下ftp服务器的搭建与使用
  7. 解决ScrollView与ViewPage滑动冲突的问题
  8. IOSday05 UIScrollView使用
  9. 两不同网段主机直连通信过程的建立(3个实验详细分析)
  10. tensorflow分布式训练之同步更新和异步更新