idea 编译spring_Spring 源码阅读环境的搭建

30541b68045cd1e4d92f0be3e0af1d6a.png
" 前言
本文记录了 Spring 源码环境的搭建方式,以及踩过的那些坑!​当前版本:5.3.2-SNAPSHOT。

环境准备

  1. Git
  2. JDK
    1. master 分支需要 JDK 11
    2. 5.2.x 分支, JDK8 即可
  3. Gradle 6.5.1
  4. IDEA 最新 (2020.2.3)

Spring 源码仓库地址:https://github.com/spring-projects/spring-framework

下载源码

  1. clone 源码
git clone  https://github.com/spring-projects/spring-framework.git

2. 使用 IDEA 打开

b124baf559cfece6c9d113a8fcad3d34.png

4e1a3c5c2b2a46f4ef6f907de2d6df91.png

3. 等待 IDEA 加载完成即可。

注: 也可以指定 clone 的分支

git clone -b 5.2.x  https://github.com/spring-projects/spring-framework.git

或者先 fork 到自己的仓库,然后再 clone。

545cedcd3517b7c944e832860105958f.png

这里我是 fork 到我的仓库,然后再 clone 的。

当前 master 分支代表的版本为 5.3.2-SNAPSHOT。

执行测试

  • 在项目右键创建 module

e2ee4b0d23d83e2ba93f41055281b95c.png
  • 选择 Gradle Java

3f45845301e7301b65dd00d971de48f1.png
  • 创建 module

abc1ba76a02480cfaadd0a73a15e9258.png
  • 在 build.gradle 中添加配置
compile(project(":spring-context"))

997d0e8fc2db5fa5e8d1d72141f4475c.png
  • 创建测试类并测试

f0adc715ccccbc320991b6505bdaed32.png

其中 UserComponent 添加了 @Component 注解, 程序正常执行则一切 OK。可以开始愉快的调试代码了。

问题总结

编译失败

有小伙伴直接下载 zip 包,可能遇到以下问题:(非常不建议直接下载 zip 包构建,想知道原因可以继续看,最后我也没有构建成功,而是直接通过 clone 构建的。)

  1. 报错如下:
fatal: not a git repository (or any of the parent directories): .gitBUILD SUCCESSFUL in 14s
Build scan background action failed.
org.gradle.process.internal.ExecException: Process 'command 'git'' finished with non-zero exit value 128	... 其他省略

effbbde540e815b184b3d12c8064a9e4.png

看意思是没有 git 配置,那就添加上吧!

2. 这时候想着添加 git

VCS -> Enable Version Control Integration... -> 右上角 Reload All Gradle Projects

依然报错

fatal: Needed a single revision

f79a75a08f227a022b777f104b7d7b1c.png

3. 查询问题

issues 地址:https://github.com/spring-projects/spring-framework/issues/24467

建议使用

$ git clone git@github.com:spring-projects/spring-framework.git

4544aeb4e93def3b6a2d14a2b9d06281.png

意思就是 zip 发行版主要是用来共享源代码,但不一定用于构建它。

4. 最后我选择了使用 clone 的方式,直接 clone 下来,然后 build 通过。

缺少 cglib 和 objenesis 包

Kotlin: warnings found and -Weeror specified

c08e5b73a950b3190800b417c9396e37.png

没有 spring-cglib-repackspring-objenesis-repack

5e85f08379b670b41eb1484728fb2e0e.png

执行这两个即可。

找不到包 jdk.jfr

import jdk.jfr.Category;
import jdk.jfr.Description;
import jdk.jfr.Event;
import jdk.jfr.Label;

JDK 升级为 11。因为我本地使用的是 JDK8,发现报错,jfr 包需要升级 JDK 11 才有。

如果不生效,可以通过:

IDEA -> File -> Project Structure -> Project 检查下是否修改为 JDK 11

快捷键:⌘ + ;

6ebca1c4a1c2c2b4c19690e75c296a2e.png

相关资料

  1. Spring 仓库:https://github.com/spring-projects/spring-framework
  2. Spring 构建文档:https://github.com/spring-projects/spring-framework/wiki/Build-from-Source

历史文章

  • ReentrantLock 源码、画图一起看一看!
  • ReentrantReadWriteLock 的原理!
  • Spring 自调用事务失效,你是怎么解决的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来自百度的一篇如何关闭Centos7的防火墙以及如何永久关闭防火墙的指令教学【转载】

转载:来自百度的一篇如何关闭Centos7的防火墙以及如何永久关闭防火墙的指令教学 使用命令:systemctl status firewalld.service 查看防火墙状态 2 执行后可以看到绿色字样标注的“active(running)”,说明防火墙是开…

Linux的Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewall(d)]【转载转载转载】

一 方案与思路 0 xshell客户端监测是否能够ping通目标服务器。 前提:知晓目标服务器IP地址 Linux: ifconfig -aWindows: ipconfig -a1 利用firewall工具,检查是否已开启ssh的22端口。若无,则:开启22端口2 利用sshd工具&#xff0…

dubbo web工程示例_分布式开发-Zooker+dubbo入门-Demo

作者:知了堂-刘阳1.什么是SOA架构SOA 是Service-Oriented Architecture的首字母简称,它是一个面向服务的架构模式(俗称:分布式;面服务的分布式)为什么互联网项目会采用SOA架构呢?随着互联网的发…

Linux如何避免每次开启 CentOS 时,都要手动开启 sshd 服务,防止连接不上Xshell

避免每次开启 CentOS 时,都要手动开启 sshd 服务,可以将 sshd 服务添加至自启动列表中, 输入 systemctl enable sshd.service 可以通过输入:查看是否开启了sshd 服务自启动 systemctl list-unit-files | grep sshd

380免费云存储_三款功能强大的云盘软件,完全替代百度云与腾讯云

众所周知!百度云是百度旗下良心产品之一,有免费版,但是免费版限速太厉害,让很多免费用户都难以接受,其次就是腾讯云,腾讯云也是腾讯旗下的良心产品之一,但是两个产品都不是很完美,那…

centos右上角wired图标消失有效解决方案【转载】

突然之间就发现centos7的右上角的网络连接不见了,卧槽,这么神奇的吗?然后又无意中在网上浏览了这个方法,简单又好用 最近在学习Linux配置nginx时,左上角的wired图标突然没了,很神奇。然后在网上按着很多博客…

mysql 关联查询_mysql数据库调优(二)

第五、查询优化1、查询慢的原因:网络因素、CPU、IO、上下文切换、系统调用、生成统计信息、锁等待时间等2、优化数据库访问:查询性能地下的原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,可以通过减少访问数据量的方…

Linux连接xshell时连不上的问题【转载】

最近这一周由于自己的xshell突然连接不到虚拟机,在网上找了很多种方法也没能解决,以至于自己在学习很多知识的时候都没能很好的去验证,去尝试。最后在求助大佬的时候终于将xshell重新连接到了虚拟机!! 以下是我对xshel…

Linux的实际操作:关机shutdown、重启reboot、用户注销logout

1.关机和重启命令 (1)shutdown :shutdown -h now(立即关机) 、shutdown -h 1(1分钟后关机)、shutdown -r now(立即重启) (2)halt:直接使用,效果等价于关机 (3)reboot&…

sql 一列中平均应发工资_劳动者的工资标准,应如何认定?

工资是指劳动者付出体力或脑力劳动后所得的对价,体现的是劳动者创造的社会价值。自我国劳动争议仲裁制度建立以来,工资(劳动报酬)争议一直是劳动争议的热点。如何准确把握工资标准的认定,对维护劳动者合法权益、构建和谐稳定的劳动关系具有重…

Linux的实际操作:用户管理(用户添加useradd -d和设置用户密码passwd)

Linux创作者对于用户管理主要体现在两个方面 1.将用户存放到不同的组去进行管理,一个用户可以放在不同的组 2.用户具有“家”目录的概念,当用户登录时,会自动进入到自己的家目录(/home) 例如:/home/user1…

配置了坐标还是找不到serv_你那么努力,为何还是找不到工作?从优势发展观来看个人职业发展...

扬子的大学专业是金融学,因为父母说学金融有前途,但扬子从小动手能力强,喜欢的是机械设计,因此他在大学期间还辅修了机械工程专业,大二的时候参加过一场业内的机械设计比赛还获得了二等奖,要知道一起参加比…

Linux如何查看所有用户和用户组信息(cat groups whoami)

1.cat /etc/passwd查看所有的用户信息 concatenate files and print on the standard output把文件连接后输出到屏幕上 cat /etc/passwd怎么看呢? 第一个user3是用户名,x是密码, 1002是用户id, 1002是用户组id, /home…

verilog 浮点转定点_定点数和浮点数

定点数定点数是指,数字在小数点之后和之前具有固定的位数。可以用Qm.n表示法进行表示.m位为整数部分 n位小数部分有符号数的总位数N m n 1当n0时,则定点数用来存储整数。定点数(整数)定点数可以用来存储整数,包括正整数和负整数。定点(整数…

Linux的实际操作:用户管理(删除用户userdel userdel -r)

首先需要查看当前有哪些用户 方法1: cat /etc/passwd 方法2: cd /home/ ll第一种删除(温柔式-保留家目录) userdel 用户名 (首先,保证在root用户的前提下去删除) 观察删除后的变化 第二种…

Linux的实际操作:查询用户id切换用户su -

1.查询用户信息:其中 (uid是用户的id号,gid是用户组的id号,属于哪个组) id 用户名 如果没有此用户,控制台就会返回信息“no such user” 2.切换用户: 在Linux操作中,如果当前的用户…

哔哩哔哩公司swot分析_「127」一个简单的工具分析自己的优势与劣势

今天要介绍的就是---SWOT分析方法。何谓SWOT,SWOT是由优势(Strength)、劣势(Weakness)、机会(Opportunity)和威胁(Threat)四个单词的第一个字母组成。SWOT分析是对组织或个人内外部条件各方面内容进行综合和概括,进而分析组织或个人的优劣势、面临的机会…

Linux的实际操作:用户管理(用户组的管理groupadd useradd usermod)

1.类似于管理角色,系统可以有共性的多个用户 2.增加一个用户组usergroup4 groupadd 新的用户组名 将user4指定到usergroup4中 useradd -g 用户组名 用户名 演示: 3.修改用户组 usermod -g 修改到的用户组名 用户名 创建一个usergroup5的用户组 将…

Linux的实际操作:用户管理(查看用户和组的配置文件/etc/passwd /etc/group /etc/shadow)

用户和用户组的相关文件 我们可以这样去理解,用户和用户组其实是我们虚构出来的东西,那这些东西肯定需要一个空间来存放他们吧,这个空间就是一些配置文件,里面可以完全查看你的用户或者用户组的信息,有些不过是进行了一…

拦截游戏窗口被移动_「维维足球pro-教案」50个传控踢法练习之(一、二)追球游戏...

如图所示,上方黄色虚线代表球的移动,中间黑色实线代表球员移动,下方黑色虚曲线代表球员带球移动。术语:卡斯特球员(kaasters):荷兰语“回传”。指站在指定地点,在一或两次触球内接到传球并回传的球员。(即进…