1.版本选择

1)源码版本:spring5.3.x

2)gradle版本:根据spring源码的工程路径:gradle/wrapper/gradle-wrapper.properties文件查看gradle版本。如图所示:

可以看到源码版本对应gradle版本为,所以可依此下载gradle-7.2版本,注意这里请保留gradle-7.2的zip压缩包,后面会用到

3)JDK版本:可以根据如下路径中的ide.gradle选择JDK版本,这里是JDK1.8

4)IDEA版本:尽量选择较高版本:我用的是2021.3.2版本

2.环境准备

1)gradle安装并配置环境变量,此步骤可自行百度

2)ieda配置gradle的存储jar包仓库,如图所示:

进入idea的全局设置,可以先打开一个工程,然后再file选项下选择close project 关闭工程可回到此界面

在这里配置gradle仓库路径,用来存储gradle编译spring源码时下载的各种jar包

3)spring源码工程构建前相关文件修改配置

  1.maven仓库下载路径修改:因为github下载的源码中maven仓库路径是国外地址,此处可更改为阿里云仓库,gradle编译时下载jar包速度会极大提升

  文件路径: spring-framework/build.gradle

  在build.gradle文件中找到repositories 代码块,配置如下路径,或者可以自行登录 【阿里云maven仓库地址:https://developer.aliyun.com/mvn/guide】选择url路径配置

repositories {
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/apache-snapshots" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url "https://repo.springsource.org/plugins-release" }//国外路径
maven { url "https://repo.spring.io/libs-spring-framework-build" }//原始路径
mavenCentral()
}

  

  2.gradle/wrapper/gradle-wrapper.properties文件修改

  默认文件配置如图所示,当我们将项目导入idea时会根据标红地址下载gradle-7.2-bin.zip压缩包,由于前面我们自行下载并配置了gradle,不需要重新下载

修改为如下路径:即存放 gradle-7.2-bin.zip文件的路径

distributionUrl=file\:///D:/Java/gradle-7.2/gradle-7.2-bin.zip

3.spring源码导入ieda

1)直接选择open打开工程

2)此时idea会为源码项目创建工作空间,等待创建完成后会立即开始构建项目,我们不要着急构建项目,还需要在IDEA中为spring源码项目配置gradle和JDK,点击停止按钮打断构建,如下所示

3)给项目配置gradle和jdk

  配置如下图:先配置图一再配置图二,

  file->project Structure->project

  file->settings->gradle

  点击确认后,项目就会开始自动build,此时无需其他操作。

4.开始构建

  1)当所有模块build完成后,提示finished表示成功

  如下的报错信息可以忽略,这个是与git相关的报错信息,不影响spring源码编译

  2)为确保所有模块都构建成功,这里可以参考官方spring源码工程中的 import-into-idea.md文档描述:先编译spring-oxm模块

在gradle中使用spring-oxm的 compileTestJava选项编译此模块(双击运行即可),具体位置如图

  3)此时再选择spring下的build选项编译整个源码项目

4)编译过程中出现spring-web模块编译失败。如下

注意报错的类和报错行:Jackson2JsonEncoderTests.java 的253行,找到这个类,将253行注释掉,如下:

为什么要注释掉:随意测试出来的,看过这个 jacksonValueUnwrappedBeforeObjectMapperSelection()方法的提交记录 是由spring团队2022.3.16提交的,注释掉不知道是否会影响spring-web模块的引用。

5)重新build ,即重复 3)步骤,编译成功

至此,spring源码编译就成功了

5.新建模块用于测试

此步骤省略不写,主要记录几个踩过的坑

1.gradle7版本和gradle5版本之间用重大升级更新 旧版本的compile关键字在新版本中已经弃用 ,换为 implementation关键字,引用项目时需要注意

2.新建模块并且已经引入了其他模块,编码测试时发现引入项目没生效

此时应该要检查自己gradle编译工具的新建模块下的runtimeClasspath下有没有自己引入的模块,没有就说明引用没成功

解决办法:

先将新建模块下的测试代码(引用其他项目中类的代码)注释掉,再重新build整个spring项目,就可以引用成功了

6.spring源码项目的拉取的技巧分享

step1:先登录自己的github账号,将spring-framework 项目fork到自己的github仓库,复制fork到自己的spring源码仓库的url

step2:登录自己的gitee的账号,选择从github导入仓库

将url填写到如下位置,点击导入即可将源码项目复制到自己的gitee中,从本地拉取速度会相当快,也可以提交自己测试代码用于总结学习

spring源码编译完整步骤拿来即用!的更多相关文章

  1. Spring源码编译一次性通过&遇到的坑解决方法

    前言 spring源码本地编译,按网上的博客参考资料的操作步骤,总是会出现各种莫名其妙的错误.根据错误信息找解决方案,但在自己的环境下又总是编译不过去.结合参加培训学习Jack老师提供的方法,自己多种 ...

  2. 【转】Spring源码编译

    原文地址: http://www.flyoung.me/2013/08/02/springcodecompile/ 参考资料: https://github.com/spring-projects/s ...

  3. 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译

    源码学习第一步,Spring源码编译 之所以写这么一篇文章是因为群里的小伙伴在编译源码时碰到了问题,再加上笔者自身正准备做一个源码的注释版本,恰好也需要重新编译一份代码,至于为什么要将源码编译到本地就 ...

  4. 1.编译spring源码

    本文是作者原创,版权归作者所有.若要转载,请注明出处 下载spring源码,本文用的是版本如下: springframework 5.1.x,   IDE工具idea 2019.2.3    JAVA ...

  5. Gradle编译Spring源码

    使用工具:JDK1.8.0_11.Gradle4.9.idea2018.1.3 1. 配置Gradle Gradle下载地址:https://gradle.org/releases/ 在下载页找到自己 ...

  6. Ubuntu搭建Spring源码环境常见问题

    在一心想要学习Spring框架源码时,我们会遇到很多麻烦的问题.开始本文前,你只需要拥有一个装好IDEA的Ubuntu系统就可以愉快启程了.如果还没有IDEA,可以参考在Ubuntu上安装Intell ...

  7. 在Eclipse上通过插件获取github上的spring源码

    spring源码开始的时候是通过SVN来管理代码的,后来是转移到github上管理源码的,可以通过在github上直接下载spring的源码. 下面讲解如何通过在eclipse上的插件git来获取sp ...

  8. 源码编译安装lnmp环境

    一.源码编译安装步骤 首先说明源码安装的好处   速度快,可自定义路径 主要有三步:1.配置 进入源码安装包  ./configure --prefix=/uer/local/nginx  可指定参数 ...

  9. spring5源码编译过程中必经的坑

    spring源码编译流程:Spring5 源码下载 第 一 步 : https://github.com/spring-projects/spring-framework/archive/v5.0.2 ...

随机推荐

  1. 微信小程序节流使用方法

    函数节流: 英文 throttle 有节流阀的意思.大致意思也是 节约触发的频率 那么,函数节流,真正的含义是:单位时间n秒内,第一次触发函数并执行,以后 n秒内不管触发多少次,都不执行.直到下一个单 ...

  2. centos网卡配置修改

    centos网卡配置文件一般位于:/etc/sysconfig/network-scripts/ 文件名一般为:ifcfg-eno或者ifcfg-eth0类似的文件,可以先用ip addr 命令或者是 ...

  3. svelte组件:Svelte自定义弹窗Popup组件|svelte移动端弹框组件

    基于Svelte3.x自定义多功能svPopup弹出框组件(组件式+函数式) 前几天有分享一个svelte自定义tabbar+navbar组件,今天继续带来svelte自定义弹窗组件. svPopup ...

  4. 解决移动端ios网页端收起键盘导致的页面空白问题

    一句代码就搞定了,只要失焦的时候把窗口滚动位置设置到(0,0)就行了 <input type="text" onblur="window.scrollTo(0, 0 ...

  5. 2022年官网下安装Studio 3T最全版与官网查阅方法(无需注册下载版)

    目录 一.环境 1.构建工具(参考工具部署方式) 2.保持启动 二.下载安装 1.百度搜索,或者访问官网:https://robomongo.org/,选择下载进入下载页. 2.进入下载页,选择如下下 ...

  6. MySQL between and 边界测试

    看到有一些博客说 between and 有不含边界的情况,于是测试了一把,记录如下.先说结论:between and 不存在不含边界的情况 1. between and 是包含边界的 id betw ...

  7. 硬吃一个P0故障,「在线业务」应该如何调优HBase参数?

    1.背景 由于种种原因,最近将核心业务生产使用的HBase迁移到了云上的弹性MapReduce(EMR)集群上,并使用了EMR的HBase组件默认参数配置. 结果在流量高峰期出现了宿主机故障,挂掉了两 ...

  8. 6月6日 python学习总结 jQuery (三)

    1. 常用事件 1. hover #鼠标悬停监听 2. keydown和keyup #键盘按键 按下/抬起 3. change #监听值的改变 全部输入完失去焦点后 4. focus和blur # 获 ...

  9. [转载]详解ssh端口转发(二)

    关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...

  10. 什么是线程组,为什么在 Java 中不推荐使用?

    ThreadGroup 类,可以把线程归属到某一个线程组中,线程组中可以有线程对象, 也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式. 为什么不推荐使用?因为使用有很多的安全隐患吧 ...