听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译
源码学习第一步,Spring源码编译
之所以写这么一篇文章是因为群里的小伙伴在编译源码时碰到了问题,再加上笔者自身正准备做一个源码的注释版本,恰好也需要重新编译一份代码,至于为什么要将源码编译到本地就不用多说了吧?
比如,你可以任意的添加注释,一边读源码一边记笔记,甚至你可以修改源码,更好的调试程序等等。但是如果你坚持通过导入依赖或者引入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
前期准备
- 确保本机已经安装好了
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/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
确保以下两个插件已经被激活
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。
听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译的更多相关文章
- Spring IOC 容器源码分析系列文章导读
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
- Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)
本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AOP%E9%A ...
- Spring IOC 容器源码分析 - 填充属性到 bean 原始对象
1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...
- Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...
- Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...
- Spring IOC 容器源码分析 - 创建单例 bean 的过程
1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- Spring IOC 容器源码分析
声明!非原创,本文出处 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 S ...
- Spring IOC 容器源码分析(转)
原文地址 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢 ...
随机推荐
- js数据劫持 Object.defineProperty() 作用
原生js Object.defineProperty() 作用 假设我们有一个obj对象,我们要给他设置一个name属性会这么做 Object.defineProperty()也可以设置对象属性 这个 ...
- 上位机开发之西门子PLC-S7通信实践
写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...
- 时间序列神器之争:prophet VS lstm
一.需求背景 我们福禄网络致力于为广大用户提供智能化充值服务,包括各类通信充值卡(比如移动.联通.电信的话费及流量充值).游戏类充值卡(比如王者荣耀.吃鸡类点券.AppleStore充值.Q币.斗鱼币 ...
- 如何快速修改/替换GIF的背景?
案例是将白色背景换成另一个颜色的背景.图是某女同事百度上搜到的,共有83个图层. 若是Windows系统的,Ctrl = Command 若是要换背景图,而不是纯色背景,步骤一样,只需将那个填充颜色的 ...
- 了解Nginx与PHP的交互?
Nginx可以接收请求并转发给PHP-FPM. 1.开始深入Nginx与FastCGI协议 通过对Nginx新增Server配置实现了nginx与PHP的一次通信,配置文件非常简单. 从上图的Ngin ...
- call,apply,bind的理解
2020-03-19 call,apply,bind的理解 先说区别call, apply基本上没什么不一样,唯一不一样的地方是传参方式不同 但是bind和call,apply有区别.bind是重新绑 ...
- 在SpringMVC获取客户端传递的数据的方式
在处理请求的方法中,加入相对应的形参,保证形参参数名和传递的数据的参数名保持一致,就能够自动赋值 value:当不满足赋值条件时,可以使用value属性,指定映射关系 required:设置形参是否必 ...
- EIGRP-16-其他和高级的EIGRP特性-2-非等价负载分担
与大多数内部路由协议不同的是, EIGRP能够将流量负载分到多条非等价路径上,而不仅仅使用去往目的地最近距离的那一条路径.提供这项功能的特性称为非等价负载分担. 非等价负载分担的核心概念是可行后继 ...
- IAT表
0X0 0 DLL介绍 DLL翻译器为动态链接库,原来不存在DLL的概念只有,库的概念,编译器会把从库中获取的二进制代码插入到应用程序中.在现在windows操作系统使用了数量庞大的库函数(进程,内存 ...
- Redis学习笔记(二十一) 事务
文章开始啰嗦两句,写到这里共21篇关于redis的琐碎知识,没有过多的写编程过程中redis的应用,着重写的是redis命令.客户端.服务器以及生产环境搭建用到的主从.哨兵.集群实现原理,如果你真的能 ...