论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
IDEA编译Spring源码教程
IDEA编译Spring源码教程
道家人
金牌会员
|
2023-4-20 15:24:15
|
显示全部楼层
|
阅读模式
楼主
主题
941
|
帖子
941
|
积分
2823
大家在学习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_HOME
2 distributionPath=wrapper/dists
3 distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
4 zipStoreBase=GRADLE_USER_HOME
5 zipStorePath=wrapper/dists
复制代码
distributionUrl:表示的就是 gradle 的下载地址,默认配置的是一个远程 URL。
distributionBase:下载后存放的目录,默认就是用户目录下的 .gradle 目录;
zipStoreBase:解压后存放的目录
我在构建的过程中发现配置的下载地址下载非常慢,经常超时,甚至有时候被墙。所以我们先下载到本地,然后修改配置文件从本地获取 gradle,这样一来编译构建就会快很多了。
我们只需要修改 gradle 的下载地址就好了,其他的配置项建议保持不变。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=file\:///D:/mysoft/Program-files/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=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 @Configuration
8 public class AppConfig { //扫描com.test下的所有bean
9 }
复制代码
编写一个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有所帮助。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
道家人
金牌会员
这个人很懒什么都没写!
楼主热帖
CentOS7.9使用sealos部署单节点k8s并部 ...
青龙2.10.13 稳定版+Ninja登录面板+傻 ...
软件危机与软件过程模型
LyScript 从文本中读写ShellCode
〖Python接口自动化测试实战篇⑨〗- 实 ...
Redis和Mysql保持数据一致性
C#_串口调试助手-网络拓扑显示 ...
推荐一款完全开源,功能丰富,界面精美 ...
如何精简 Prometheus 的指标和存储占用 ...
Go面经 | 成都Go面试这么卷?卷王介绍 ...
标签云
CIO
存储
服务器
快速回复
返回顶部
返回列表