为了阅读分析Spring 5源代码,需要搭建环境将源代码导入到本地。我们使用IntelliJ IDEA作为IDE工具来分析源码。网上有很多教程要么太老,要么没有经过实践验证,要么不完美报一堆错误。 本文以比较新的Spring 5.x为例,详细进行说明,而且build编译结果完美无错误。

1、环境准备

环境 版本 备注
Java 1.8.0_241 Java HotSpot™ 64-Bit Server VM (build 25.241-b07, mixed mode)
IDE IntelliJ IDEA 2020.1 旗舰版
Git 2.27.0(已本地独立安装) 需要通过Git远程获取代码。本地独立安装了Git,在Idea中设置Git安装的路径
Gradle IntelliJ IDEA 自带 因为Spring的源代码使用Gradle管理和构建,因此需要此插件
AspectJ 1.9.5 需要单独下载安装(下载安装的过程见文后)

以上设置(及其他IDEA的设置)具体过程截图可以参考此链接:IntelliJ IDEA 2020 安装后常规配置https://blog.csdn.net/zyplanke/article/details/105576304

2、获取源代码地址

访问https://github.com/, 在搜索框中输入spring-framework。如下图

在spring-framework工程中,如下图,右侧获得源代码的git clone的URL地址,拷贝该地址。 该URL为:https://github.com/spring-projects/spring-framework.git

注意:如果Download Zip需要注意左侧的Branch分支,以下载对应的版本。 如果不下载zip,而是直接拷贝URL地址,通过git clone则默认自动下载master主分支。

3、源代码导入IDEA

1、打开IDEA如下图(如果之前已经开了其他工程,则应先通过菜单File→Close Project关闭其他工程),选择“Get from Version Control” 。
然后Version control工具选择Git,在URL地址中粘贴刚才拷贝的URL地址。

2、点击“Clone”按钮,IDEA开始执行git clone,需要漫长的等待(根据网速,约一两个小时),如下图。

如果网络不好而报错(cloning下载过程中经常报RPC failed; curl 18 transfer closed with outstanding read data remaining the remote end hung up unexpectedly early EOF index-pack failed),则可以反复尝试几次。 根据经验尝试3~5次基本能成功,所以我一般使用这个方法。
另外:(网上提供的方法)如果在Idea配置中指向了本地单独安装的Git软件,则可以在本地单独安装的Git软件中执行:git config --global http.postBuffer 524288000 增加postBuffer大小,然后重启IDEA,据说可以避免上述问题(实际测试,设置后依然包上面的错误。)。

3、Git clone下载完毕后,会自动使用Gradle进行Build(Gradle会自动下载依赖的包,通常又得等个把小时)。最后的结果如下图。BUILD SUCCESSFULL。

4、确认源代码版本,打开gradle.properties文件,可以查看当前Sring源代码的版本。

4、解决错误

上面使用Gradle的build成功并不会将java源代码编译为class文件。
需要通过IDEA菜单“Build → ReBuild Project”编译才能将整个工程编译为class。 但在编译过程中会报错,报错解决过程如下:

4.1 缺少cglib和objenesis等的编译错误

为了避免与第三方class冲突,Spring把最新的cglib和objenesis给重新打包(repack)了,它并没有在源代码里提供这部分代码。需要把相关的jar获得,才能编译spring-core。 不然会报缺相关的类。
**解决办法:**在IDEA界面的最右侧找到Gradle窗口,然后在Tasks→other下面分别双击cglibRepackJarobjenesisRepackJar

然后会自动下载相关Jar。
**同样类似的:**还可能报java: 程序包org.springframework.oxm.jaxb.test不存在,则在Gradle窗口中,Tasks→other下面双击genJaxb
下载后在spring-core的lib目录下的jar文件,如下图:

4.2 Kotlin的JVM版本不对

如果报Kotlin: Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8',则在Settings → Build, Exexution, Deployment → Compiler → Kotlin Compiler中,修改Target JVM Version。

4.3 AspectJ问题

如果报一下图中错误,因为aspect不是Java标准的关键字,需要使用Ajc。

解决办法:
①先从官网https://www.eclipse.org/aspectj/downloads.php 下载文档版本的jar。

②然后执行“ java -jar aspectj-1.9.5.jar”,进入如下安装界面

③如下界面,确认当前已经存在的Java JRE的路径(通常不用修改)

④如下图,选择AspectJ的安装目标目录(根据实际情况设置)。然后点Install 安装。

⑤然后在IDEA中,Settings → Build, Exexution, Deployment → Compiler → Java Compiler 如下图设置。将Use compiler设置为Ajc,将Path to Ajc compiler设置为AspectJ安装目录下的lib文件夹中的aspectjtools.jar文件,同时,需要勾选Delegate to Javac选项(它能够只编译AspectJ的Facets项目,而其他普通项目还是交由Javac来编译)。

⑥分别对spring.spring-aop.mainspring.spring-aspects.main添加Facets属性。在IDEA中“Project Structure…”界面中,选择Facets,点击“+”号,选择AspectJ,再选spring-aop.main。 添加后自动切换到Modules界面,确认结果。

同样,对于spring.spring-aspects.main也按以上步骤添加Facets。 两个都添加完毕后结果如下图

5、完美编译无错误

经过以上步骤,再次通过IDEA菜单“Build → ReBuild Project”编译整个工程(两三分钟),在Messages界面中提示:Build completed successfully,没有错误(只是有警告)。
至此编译完毕

而且,查看每个module的build文件下,已经生成了许多class文件。如下图。

Spring5源代码研究01:源码导入与环境搭建(完美无错误)相关推荐

  1. ffmpeg编译gb28181_RTSP/GB28181协议/海康SDK/Ehome协议视频上云网关EasyCVR视频平台在linux环境下ffmpeg源码单步调试环境搭建...

    目前TSINGSEE青犀视频研发的视频上云服务平台EasyCVR已经可集成海康EHome私有协议,并且在前文中我也跟大家讲过EHome协议的配置和调用流程,有兴趣的可以阅读一下:配置及协议介绍.Eho ...

  2. Mycat源码篇 : 起步,Mycat源码阅读调试环境搭建

    在研究mycat源码之前必须先把环境搭建好.这篇文章的目标就是搭建mycat源码调试环境.环境主要包括: git jdk maven eclipse mysql 这里假设你知道上面的知识点.我们搭建的 ...

  3. build怎么调试 react_React源码下载-本地环境搭建

    前几天有小伙伴和我聊天,谈到现在前端面试越来越难,动不动就是xxx原理,有没有看过xx源码之类的问题, 之后就问我应该怎么来学习现在主流框架的源码,于是有了这一篇文章. 说到使用react那很简单 r ...

  4. EDK2源码下载及环境搭建

    一.EDK2源码下载 上一片笔记中已经下载了git工具这里用git工具来下载edk2源码及编译工具 首先从github中将edk文件导入到我们的gittee仓库中再从我们的gitee仓库中下拉到我们的 ...

  5. 4.2.10 Kafka源码剖析, 阅读环境搭建, broker启动流程, topic创建流程, Producer生产者流程, Consumer消费者流程,

    目录 4.1 Kafka源码剖析之源码阅读环境搭建 4.1.1 安装配置Gradle 4.1.2 Scala的安装和配置 4.1.3 Idea配置 4.1.4 源码操作 4.2 Kafka源码剖析之B ...

  6. Elasticsearch源码解析:环境搭建

    在之前学习Redis的过程中,我就是一边通过文档/视频学习,一边阅读源码.我发现两种方法可以相辅相成,互相补充.阅读文档可以帮助我们快速了解某个功能,阅读源码有助于我们更深入的理解这一功能的实现及思想 ...

  7. 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★

    文章目录 一.Android 进程注入工具开发系列博客 二.Android 进程注入工具 源码下载编译 三.逆向环境搭建 四.使用注入工具进行逆向操作 1.获取远程进程号 2.注入工具准备 3.注入动 ...

  8. Swift之源码编译的环境搭建和编译流程

    编译环境 版本准备:macOS 10.15.3 Xcode 11.5 brew install cmake njnia Python 2.X Swift 源码地址:Apple/Swift 编译流程 ① ...

  9. 消息中间件RocketMQ源码解析-- --调试环境搭建

    1. 依赖工具 JDK :1.8+ Maven IntelliJ IDEA 2. 源码拉取 从官方仓库 [https://github.com/apache/rocketmq) Fork 出属于自己的 ...

最新文章

  1. R语言数据结构之数组
  2. c语言220程序,《C语言程序实例大全》原代码220例
  3. java用循环语法在窗体中显示文字,如果子窗体在窗体视图中,则访问2003循环当前页面不起作用...
  4. ionic cordova 常用命令
  5. JTable 学习一
  6. ubuntu18.04 server配置静态ip
  7. 仓库镜像源为清华_conda国内镜像修改(最新版)
  8. 激活navicat12
  9. Qt调用Com组件--QT调用COM组件DLL(dumpCPP工具)
  10. 二部图 欧拉图 哈密顿图 平面图 判定条件
  11. 使用requests post请求爬取申万一级行业指数行情
  12. 方差递推公式_常见递推公式(数学)
  13. 高防服务器的机房硬件防火墙类型和主要功能
  14. Log4j使用配置总结
  15. 使用downloadm3u8和ffmpeg下载m3u8格式视频
  16. Google发布文本内容生成短视频工具:Imagen Video
  17. 大众点评:开放质疑与阿里竞争
  18. 每日新闻:未来,电脑像手机一样?
  19. python读取txt中文乱码
  20. Android:根据文件大小自动转化为KB, MB, GB

热门文章

  1. 基金从业考试难吗?0316
  2. Java网络爬虫开发
  3. C语言基础---指针数组----初始化方式常量指针数组、指针常量数组
  4. IT专业大学生迷茫些什么
  5. STM32学习笔记-大小端模式详解
  6. [Python] windows下360急速浏览器获取URL的Headers
  7. mysql基本命令4
  8. 测试应届生是去自研小公司好还是外包公司好?
  9. float类型表示方式及范围深度解析
  10. 网络入侵敲响警钟,数据安全不容忽视!