最新要闻
- 通讯!估值1000亿 消息称国产内存厂商寻求IPO上市:4年前量产首款DDR4芯片
- 张颂文用小米13 Ultra拍照!网友建议加上水印
- 【天天时快讯】巴西总统认为电子游戏是垃圾 让年轻人学会暴力杀戮
- 长达10年维护落幕:微软提醒Office 2013已停止支持
- 当前速看:郑渊洁称维权生活像吃苍蝇:21年只成功37个商标 还有673个没成
- 联想刘军:今年将是大客户市场的 “大年”
- 浑厚悠扬!三号楼的钟声……
- 每日热议!房玄龄杜如晦被谁重用_房玄龄杜如晦
- 新消息丨微软苏菲要换代了!Surface Pro 10/Go 4新品曝光:外形/配置大变
- 【环球报资讯】最新研究:黄河上游区域性干旱能“算来”
- 这个火车站客流暴增,原因竟是……
- 全球信息:雪莲子的功效与副作用 雪莲子的功效与作用及食用方法
- 世界播报:真我11系列拍摄样张首秀:长焦恐怖 可见月亮纹理
- 【热闻】没人比我更懂外星人?马斯克:如果找到外星人 我立马发推
- 环球热资讯!ZV-E10同款传感器:索尼FX10视频机即将发布
- 环球快资讯:熊孩子躲袋子里玩误被司机碾压 路人合力抬车救援:网友吐槽家长心大
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球新动态:IDEA编译Spring源码教程
大家在学习spring时源码总是绕不开的,今天我分享一下我的spring源码编译过程,详细讲解了常见问题的解决办法。
此过程中要用到的工具及版本:
1.JDK11
(资料图)
2.Spring-framework 5.3.27
3.Gradle7.5.1
4.IDEA 2021.3
文章目录:
1.下载spring源码
2.阅读spring官方编译文档
3.修改gradle相关配置
4.开始编译构建
5.导入IDEA
6.测试验证
7.总结
1.下载spring源码
首先从spring官网https://spring.io/下载源码,spring全家桶包含许多框架,我们选择今天的主角spring-framework,
我们可以看到,目前官网上最新版本是6.0.8,更新速度还是很快的,每个版本更新的新特性可以适当了解一下,生产环境不建议用最新版本。今天我选择一个常用的稳定版本5.3.27来编译测试。
点右上角的github图标进入GitHub上的源码页面,页面默认为最新版本,若要编译最新版本直接git clone即可,但是我选择右边release,找到我想要的历史版本5.3.27,选择zip包下载即可下载源码。
为了方便大家,可以直接点击此处连接进行下载https://github.com/spring-projects/spring-framework/archive/refs/tags/v5.3.27.zip
2.阅读spring官方编译文档
其实呀,很多搞不定 Spring 源码编译的小伙伴,肯定很多都是去网上随便找个教程,结果各种踩坑,因为搜到的资料参差不齐,这点估计大家都深有体会了。
所以我们就要养成一个习惯,必须要看官方文档。这里也不是要求大家其它资料不看,毕竟也有很多优秀的博客,大家都是成年人,肯定是全都要喽。
官方文档一般都是英文,但是别害怕,找个有道翻译,一下就搞定了。
如何编译 Spring 源码其实 Spring 官方提供了详细的文档,有离线版也有在线版,也就是开源项目都有的 REDAME 文件。
我这里选择离线版来演示吧。我们解压进入到下载好的 Spring 框架源码项目下,查看 REDAME 。
用记事本打开会看到里面有一个build from source的连接,对应的就是spring源码官方编译文档了:https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
接下来,咱们就按照文档来编译Spring-Framework5.3.27
版本的源码。 根据文档的说明,首先我们要有一个JDk11
或者更高的版本环境
我电脑安装的是JDk8,但是会报错:程序包
jdk.jfr不存在,经过排查发现jdk8的lib中是没有jfr这个包的,所以我换了JDK11进行编译。
3.修改gradle相关配置
接下来我们需要修改一堆配置,确保编译的环境。
下载gradle
因为第一次运行就会去下载gradle
到本地,然后通过gradle
来编译Spring
源码。 这个就很慢了,外网服务器下载,你懂得,有被墙的风险,并且本身也贼慢。
那为什么开始编译构建就会自动下载gradle
呢?从哪里下载?下载的版本是多少?
打开spring源码包,找到里面一个叫gradle的子工程,里面有相关gradle的配置。
打开配置文件gradle-wrapper.properties,有如下内容:
1 distributionBase=GRADLE_USER_HOME2 distributionPath=wrapper/dists3 distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip4 zipStoreBase=GRADLE_USER_HOME5 zipStorePath=wrapper/dists
distributionUrl:表示的就是 gradle 的下载地址,默认配置的是一个远程 URL。
distributionBase:下载后存放的目录,默认就是用户目录下的
.gradle
目录;zipStoreBase:解压后存放的目录
我在构建的过程中发现配置的下载地址下载非常慢,经常超时,甚至有时候被墙。所以我们先下载到本地,然后修改配置文件从本地获取gradle
,这样一来编译构建就会快很多了。
我们只需要修改gradle
的下载地址就好了,其他的配置项建议保持不变。
distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=file\:///D:/mysoft/Program-files/gradle-7.5.1-bin.zipzipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/dists
上述配置的意思就是如果我们运行 ./gradlew 会自动去file\:///D:/mysoft/Program-files/gradle-7.5.1-bin.zip这个目录下载一个 gradle 到当前用户的 .gradle\wrapper\dists目录 ,然后解压到当前用户的 .gradle\wrapper\dists 目录。切记:distributionUrl这个本地路径中不能有空格,否则会报错的
改完上面的配置后,我们修改gradle仓库的配置。与maven类似,gralde下载依赖包默认是从国外仓库下载的,那就会超级慢,我们要把仓库地址改为国内的阿里云仓库,提高编译速度。
找到spring源码根目录下的build.gradle,添加阿里云仓库地址
1 maven { url "https://maven.aliyun.com/repository/public" } //阿里云
第二步,找到spring源码根目录下的settings.gradle,添加阿里云仓库
第三步(可以不配置),gradle下载依赖的位置。
gradle默认下载依赖的位置是根据环境变量GRADLE_USER_HOME决定,默认是在C:\Users\用户名\.gradle\caches\modules-2\files-2.1 路径中,因为之前一直用的maven库,这里我们配置环境变量GRADLE_USER_HOME也指向maven本地仓库的地址。
4.开始构建编译
我们编译构建 Spring 源码,一般都是要导入到 IDEA 里面进行测试或者阅读的。Spring 对于如何导入也提供了文档,是不是很贴心。当然也有导入 Eclipse 的文档,大家可以根据自己的需求来操作。我这里是用 IDEA 的,你如果导入 Eclipse 操作也都是基本上一样的。 打开spring源码根目录,查看import-into-idea.md文件,当然如果要导入eclipse也有import-into-eclipse.md文件。
根据提示文档,在导入idea之前要提前先编译spring-oxm、spring-core这两个模块
在spring源码根目录打开一个cmd命令窗口,执行以下命令进行编译,如果cmd命令遇到:"." 不是内部或外部命令,也不是可运行的程序 这个错误时,说明gradle环境没有配置好,可以配置下gradle环境变量,或者直接打开一个powershell窗口进行编译即可。
1 ./gradlew :spring-oxm:compileTestJava
编译之后发现报错:
这个问题就是上面说的JDK版本问题,我本地用的jdk8,但是jdk8没有jfr这个包,我们升级jdk11就可以了,接着编译:
第一次预编译应该会很慢,gradle需要下载依赖包,只需要耐心等待即可。
接下来编译第二个模块,spring-core,执行以下命令,可以看到编译成功。
1 ./gradlew :spring-core:compileTestJava
5.导入IDEA
打开IDEA,左上角依次点击:File->New->Project from Existing Sources
选择源码的根目录:
选择编译工具为gradle
点击完成之后,就打开了项目,第一次打开会进行编译下载依赖包,需要等一会儿,具体时间长短要看电脑性能,
过了一会儿发现我的编译报错了,
如果出现这个错误的话,基本上就是IDEA与gradle的版本不一致问题,在网上搜的话都会让你修改gradle各种配置,但即使修改好了,也会出现另外的问题,听我的,一定直接升级IDEA版本,我之前用的是2019.2,版本缺失有点老了,升级到了2021.3,问题立马就解决了,而且新版本的IDEA比老版本性能也提升不少,该升级就升级。
升级完版本之后继续编译会看到下面的编译成功信息:
接下来,我们对IDEA进行一些配置,改成使用我们本地的gralde和本地的maven仓库,这样编译会更快,
至此,IDEA编译spring源码就算大功告成了。
6.验证测试
编译成功了之后,我们新建一个模块,用来写自己的一些代码。
1.在IDEA中新建module,
输入我们的模块名称,点击Finish即可。
2.创建好模块之后,我们需要对gradle进行一下配置,添加spring依赖,就像是在maven的pom文件里添加依赖一样
1 implementation(project(":spring-context"))
2 implementation(project(":spring-core"))
如下图:
3.编写测试类代码
编写配置类代码,指定spring扫描bean的路径
1 package com.test;2 3 import org.springframework.context.annotation.ComponentScan;4 import org.springframework.context.annotation.Configuration;5 6 @ComponentScan("com.test")7 @Configuration8 public class AppConfig { //扫描com.test下的所有bean9 }
编写一个service,可以被扫描到
1 package com.test; 2 3 import org.springframework.stereotype.Service; 4 5 @Service 6 public class TestService { 7 8 public void helloWorld(){ 9 System.out.println("Hello World");10 }11 12 }
最后获取到这个bean,并调用bean的方法
1 package com.test; 2 3 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 4 5 public class Atest { 6 7 public static void main(String[] args) { 8 9 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);11 12 TestService testService = (TestService)context.getBean("testService");13 testService.helloWorld();14 }15 16 }
运行我们的测试方法,输出以下结果:
这就是测试的service中helloworld()方法输出的内容,说明我们的soring已经配置好了可以使用了。
如果在运行时出现以下异常报错,说明我们的jdk版本过低,需要将IDEA中编译环境设置的高一点。
修改如下的配置,将IDEA的jdk版本还有编译级别都设置的高于java8 ,我这里用的是jdk11,所以设置成11。
最后,也是最重要的一步,将setting中的编译级别改为11,就可以成功执行了。
7.总结
至此,整个spring源码编译过程已经完成。每个版本的spring源码对应的编译过程,都会出现各种各样的问题,大家只要按照官方文档、多搜搜资料就可以顺利解决问题了,如果大家编译过程中有什么问题,欢迎留言进行探讨。希望此文对大家学习sprig有所帮助。
关键词:
-
当前快播:【Jmeter】Request1输出作为Request2输入-后置处理器
【Jmeter】基础介绍-详细接上文,继续介绍Jmeter,本文关注点为如何解决上文中提到的第一个问题,即:需...
来源: 环球新动态:IDEA编译Spring源码教程
微资讯!使用etcd实现Master的选举功能
Rust 知识积累(6)
当前快播:【Jmeter】Request1输出作为Request2输入-后置处理器
世界热文:详解数据结构中栈的定义和操作
通讯!估值1000亿 消息称国产内存厂商寻求IPO上市:4年前量产首款DDR4芯片
张颂文用小米13 Ultra拍照!网友建议加上水印
【天天时快讯】巴西总统认为电子游戏是垃圾 让年轻人学会暴力杀戮
长达10年维护落幕:微软提醒Office 2013已停止支持
当前速看:郑渊洁称维权生活像吃苍蝇:21年只成功37个商标 还有673个没成
联想刘军:今年将是大客户市场的 “大年”
浑厚悠扬!三号楼的钟声……
每日热议!房玄龄杜如晦被谁重用_房玄龄杜如晦
全球快资讯:springboot 中使用 RabbitMQ 配置使用优先级队列
查看Unity3D中默认的变量名与按键的映射
时隔6年后,我又回到博客园了
环球看点!更新整理了一大波热门免费可用的API大全
微动态丨ChatGPT闲谈——火出圈的为什么是 OpenAI?
新消息丨微软苏菲要换代了!Surface Pro 10/Go 4新品曝光:外形/配置大变
【环球报资讯】最新研究:黄河上游区域性干旱能“算来”
这个火车站客流暴增,原因竟是……
全球信息:雪莲子的功效与副作用 雪莲子的功效与作用及食用方法
世界播报:真我11系列拍摄样张首秀:长焦恐怖 可见月亮纹理
【热闻】没人比我更懂外星人?马斯克:如果找到外星人 我立马发推
环球热资讯!ZV-E10同款传感器:索尼FX10视频机即将发布
环球快资讯:熊孩子躲袋子里玩误被司机碾压 路人合力抬车救援:网友吐槽家长心大
环球速看:一大众轿车高速路恶意别车!S形行驶10公里:官方已介入调查
每日焦点!诺诚健华宣布奥布替尼成为中国首个且唯一获批针对边缘区淋巴瘤的BTK抑制剂
田园变游园
中国联通跌5.6% 民生证券在其年内高点推荐
全球简讯:再获殊荣!华为云GaussDB喜提“科技进步一等奖”
当前最新:开发者必读!常用的二维码生成器 API 推荐
第六章 面向对象编程
当前短讯!【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
全球讯息:JavaScript 九九乘法表
每日快看:墨水人_墨水
即时:今日描写冬季的古诗名句_描写冬季的古诗
仙剑系列首款开放世界游戏!《仙剑世界》公布首支预告
每日看点!用科技诠释豪华!一文看懂AITO问界M9有多少硬核“黑科技”
环球信息:西安一极氪001全国首烧?极氪回应:初步排除电池起火
全球最新:价格崩了!全新日产天籁直降4.9万:不到14万可买合资中型轿车
全球快报:上海车展宝马Mini展台被曝区别对待 冰激淋只给外国人免费吃
进程处于临界区是什么状态?进程处于临界区可以调度吗?
iu14D2N.tmp是什么意思?iu14D2N.tmpiu14D2N.tmp可以删除吗?
miui开发版内测和公测哪个好?miui开发版内测更新频率是多长时间?
拆机版单反是什么意思?拆机版单反与套机的区别是什么?
苹果IPAD用哪个助手好?苹果ipad型号大全及价格表
当前速读:后台性能测试规范
世界聚焦:福建省练习题
Oracle 备忘清单_开发速查表分享
环球速讯:我想听张惠妹的歌_渴了 张惠妹演唱歌曲
今热点:蜂巢能源“龙鳞甲汽车电池”亮相:续航超1000km 热失控不起火
全球报道:清热降火 一朵泡一杯!徽春堂金丝皇菊10.9元大促(2袋约50朵)
华为智能驾驶总裁:华为智能驾驶体验明显好于特斯拉
小米13 Ultra京东全版本卖断货!很多米粉跟员工要F码
【天天快播报】加量还减价!小米平板6 Pro预售战报出炉:2023年双平台预售量新高
到2028年AIoT平台市场价值249亿美元
环球速讯:前端跨域解决方案——JSONP
最新消息:系统之家win7纯净版官网下载_系统之家win7纯净版官网
环球焦点!昆明高新区持续优化知识产权创新环境
“吉林一号”卫星传图!从太空视角俯瞰春耕锦绣画卷
【世界新要闻】“四驱性能 两驱能耗、价格”降维打击!哈弗枭龙MAX千岛湖试驾
当前时讯:4499元!Redmi X 85英寸电视上市:120Hz高刷、3+32GB大存储
曝iPhone 15 Pro Max独占潜望长焦:苹果选了两家供应商
天天速讯:日本报告称:新电池专利中国在数量上领先 日美在质量上更佳
2023年最新微信小程序抓包教程
当前速递!【读财报】上市险企2022年年报:5家偿付率均下滑 中国平安归母净利润及内含价值位列第一
全球要闻:特斯拉称今年是一个独特的机遇:降价利润依然可控 我们成本领先
世界视点!湖北巴东发现罕见白麂:古代称为“瑞兽”
女子晒衣服不慎10楼跌落悬挂2楼 现场可怕:官方提醒提高安全意识
当前聚焦:2999元 索尼首款专业开放式监听耳机MDR-MV1发布:沉浸感无敌
当前消息!别吐槽网速慢了!2023年第一季度全球宽带最快城市在我国北京
学好虚拟化,首先要学Linux
【焦点热闻】多地展开公司债发行人自查自纠 四大事项成关注重点
这下跟安卓真没区别!iOS 17确定支持第三方应用商店 苹果被逼
环球热门:12-240四摄8焦段!小米13 Ultra影像功能深度解析
李想吐槽变色天窗玻璃如同卫生间隐私膜 理想汽车坚持用电动遮阳帘
看点:学系统集成项目管理工程师(中项)系列09_收尾管理
全球观热点:索尼发布4K HDR旗舰监视器:双液晶面板 峰值亮度4000尼特
每日热文:GPT-4可能对经济领域的近期影响,以及远期对全球可能产生的深远影响。
天天百事通!去年我是怎么解决团队问题的
新日2022年净利同比暴增1326.25%!卖了257万辆电动自行车
焦点热文:在上海车展逛了两天 愣是找不出一辆值得写的油车!
世界今日报丨爷青回!电影《灌篮高手》今日上映:等了20多年的全国大赛开打
焦点快看:等等党赢了!华为Mate 50系列官方降价:最高便宜800元
AutoGPT是什么?超简单安装使用教程
今日精选:微信小程序、uniapp、vue生命周期钩子函数
【全球新视野】PS5 Pro为期不远 索尼PS5完全不缺货:黄牛被逼低价清仓
环球微动态丨03 设置工作环境与环境(二)GRUB二级引导器
环球观点:新能源车不好卖!宁德时代一线工人:做四休三想加班 没活干盼着忙起来
热议:高性能HBM显存芯片:被韩国企业垄断了
5999元安卓影像之王 小米13 Ultra优化跟上了:1天内两次升级MIUI14
全球观察:关于shell变量值的截取-通过分隔符-去除前后匹配到的内容
高毅资产冯柳、重阳投资裘国根“相逢”海康威视
环球快播:华为“黑科技”悉数上车!AITO全尺寸旗舰SUV问界M9开订:50-60万元
宝马喊话“我们的家在中国” 网友神点评:求生欲太强
夏季空调开启前 这些准备工作必须做到位
当前通讯!估计雷军都没想到 小米摄影手柄被用在了友商手机上
A卡大面积降价后 NVIDIA终于坐不住了:RTX 4090/4080破发
世界热讯:牛顿迭代法求方程根