实况:老菜鸟自力更生从零开始重学spring目标是画出一张唬人大图(二、源码下载编译)

前情提要:调试前的基础知识梳理

速览

  • “Spring”包含哪些东西
  • 源码下载
  • 源码编译
    • 1、编译工具选择:gradle
    • 2、使用gradle编译spring并导入idea
      • 预编译spring-oxm
      • 导入IDEA
      • 确认合适的jdk版本
      • 排除spring-aspects模块
  • 开始调试

“Spring”包含哪些东西

   可以明确的是,“spring”不是一个东西,而是一系列东西。最原始的“spring”即“Spring Framework”,凝聚了spring的核心和精华:依赖注入、事物管理、面向切面等等。如今的“spring”可以理解成一个生态,例如在spring framework的基础上发展出了spring cloud用于分布式管理、“一刀99级傻瓜版”的springboot等等。学习spring的源码,其实就是学习spring framework,常常耳闻的一些东西例如“spring-context”、“spring-webmvc”、“spring-aspects”等都是spring framework的组件。所以spring能做的东西是很多的,“依赖注入”、“控制反转”、“事务控制”这些内容,只不过是日常工作接触最多的概念和功能。

源码下载

源码地址
我的项目多用4.3.4.RELEASE版本,其实已经是非常老的版本了,不过对源码学习来说其实没什么影响(不久的将来直接被打脸,所以建议用5.x以上较新版本)。所以我就下载这个版本了:

git clone --branch v4.3.4.RELEASE https://github.com/spring-projects/spring-framework.git

下载之后看到一个spring-framework的目录,里面就是spring的java源码了。

源码编译

1、编译工具选择:gradle

   平时可能用maven比较多,但是spring的官方使用gradle进行编译,所以我入乡随俗了。这里顺便让老软介绍下gradle:
在这里插入图片描述在这里插入图片描述
   接下来先下载和配置一下gradle(其实不一定要手动下载,后文会提到)。gradle下载地址,这里有很多版本,仍然入乡随俗,我选择了和spring v4.3.4.RELEASE官方编译时使用的那个版本:在/spring-framework/gradle/wrapper/gradle-wrapper.properties文件中,用记事本打开能看到官方用的是2.14.1版本:
在这里插入图片描述
下载后是个*.zip的压缩包,直接解压即可。为了可以在任何地方都运行gradle,最好再设置下gradle的环境变量(这里不再赘述,百度谷哥一大把)。配置完后验证下,任意地方打开cmd输入gradle -v即可。

2、使用gradle编译spring并导入idea

  关于这一步,spring官方已经提供了说明,源码目录中有个md文件叫“import-into-idea.md”,里面就是完整步骤:
在这里插入图片描述
翻译下就是:
(在下载好的spring-framework目录中)
1、预编译spring-oxm模块
2、导入IDEA
3、确认合适的jdk版本
4、排除spring-aspects模块

预编译spring-oxm

首先这是个什么东西,问下老软:
在这里插入图片描述
原来是个用于XML和beans互相转换的工具。使用git bash执行命令./gradlew cleanIdea :spring-oxm:complieTestJava(这个命令执行完后源码路径下会生成一些配置文件便于导入idea)。从输出log中可以看到,这个命令会下载gradle并自动解压(所以上一步手动下载gradle非必须),执行很多buildSrc的编译脚本,下载各种依赖和插件等等。不过很遗憾但意料之中地报错了:
在这里插入图片描述
作为一个服务端老鸟,面对这种报错不仅云蛋风轻,甚至注意到了最后一句(上图红框),看起来是通过http get资源时异常了,按照我的经验很可能就是访问外网导致的。于是按照这篇文章中的方法,把build.gradle文件中的maven源改成国内源:
在这里插入图片描述
然后重新执行./gradlew cleanIdea :spring-oxm:compileTestJava,但是依然报错。。。于是命令里加上"-info"参数看看详细日志,结果发现两个资源没找到(下图中可见):org.springframework.build.gradle:propdeps-plugin:0.0.7和io.spring.gradle:docbook-reference-plugin:0.3.1。
在这里插入图片描述
此时,最直观的解决办法就是去找这俩文件,我也是这么做的,一通搜索和操作后还是没解决,很郁闷:国内的源到底行不行啊!在我正摇头晃脑的时候突然灵光一闪,有没有可能因为我下载的spring和gradle版本都太老了,才出现这种插件或者依赖找不到的问题。要不先直接换个spring的v5.3.37试试(相应的gradle也换成7.5.1版本)? 按照我一介老鸟的经验,坑是躲不掉的,类似这种躲坑的行为,最终的结局那必然是。。。一切顺利,BUILD SUCCESSFUL。。。
在这里插入图片描述

导入IDEA

  上一步编译完后可以在spring-framework目录下看到一个.gradle目录,这个就是导入IDEA需要用的。打开IDEA:File》New》Project from Existing Source》选择spring-framework路径中的“.gradle”,然后就是漫长的等待(我这里足足耗时30min19s),最终看到BUILD SUCCESSFUL就是成功了。成功后大概下图这个样子,可以看到左边项目结构中熟悉的spring-beans、spring-context等。
在这里插入图片描述

确认合适的jdk版本

  这个其实没啥好说的,安官方的说法,最好jdk1.8+就行
在这里插入图片描述

排除spring-aspects模块

  至于为什么排除这个模块,在官方的导入说明中写的很清楚(前文有图),因为spring-aspects会依赖外部模块Aspects,从而可能引起IDEA的编译异常。排除一个模块很简单:File》Project Structure》Project settings》Modules,右侧把spring-aspects删掉就行:
在这里插入图片描述

开始调试

  万事俱备,如何开始调试呢?回想下平时在公司面向cv编程时,都是引入spring的pom依赖后就开始写业务代码的。所以这次的调试也是一样的,得有段业务代码。这段业务代码该怎么写合适呢?我没想出来,但是那些讲spring的培训机构肯定有最佳实践,所以借鉴一下就行。且听后话。

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

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

相关文章

代码随想录算法训练营第二十四天| (回溯) 77. 组合、 216.组合总和III、17.电话号码的字母组合

77. 组合 题目链接:77. 组合 文档讲解:代码随想录 状态:很多细节忘了 思路:先画图,然后可以发现,从1到n中选择k个数,可以看成是一个递归过程,这个递归的深度就是k。然后遍历当前这层…

Centos7安装jdk8或11以及切换方案

目录 jdk安装 安装OpenJDK11 安装OpenJDK8 配置默认的 Java 版本 验证 全局环境变量(选配) 个人版(自己可以用,公司不建议) 公司版本 /etc/profile 和 ~/.bash_profile 区别 前言-与正文无关 生活远不止眼前的苦…

【动态规划】| 路径问题之不同路径 力扣62

🎗️ 主页:小夜时雨 🎗️ 专栏:动态规划 🎗️ 如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

建筑电工精选最新模拟试题(含答案)

一、填空题 1、我国安全生产的基本方针是 安全 第一,预防 为主,综合治理。 2、特种作业人员,必须积极主动参加培训与考核 。既是法律法规的规定,也是自身工作,生产及生命安全 的需要 3、触电急救&#x…

【Tkinter界面】Canvas 图形绘制(03/5)

文章目录 一、说明二、画布和画布对象2.1 画布坐标系2.2 鼠标点中画布位置2.3 画布对象显示的顺序2.4 指定画布对象 三、你应该知道的画布对象操作3.1 什么是Tag3.2 操作Tag的函数 https://www.cnblogs.com/rainbow-tan/p/14852553.html 一、说明 Canvas(画布&…

【Windows】配置Flutter开发环境

一、下载 flutter sdk 点此跳至下载官网 下载好flutter sdk,并解压到自定义的位置。 二、配置环境变量 此电脑 --> 右键 选择 属性 --> 点击 高级系统设置 --> 会弹出系统属性的窗口,点击 环境变量 按钮 1.配置加速镜像地址 PUB_HOSTED_…

【python】python指南(四):typing静态类型注解综述

一、引言 对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言,实习的时候做一个算法策略后台用的是php,毕业后做策略算法开发,因为要用spark&#x…

大话C语言:第24篇 预处理

1 C语言编译流程 C语言的编译流程包括: 预编译:将.c 中的头文件展开、宏展开,生成的文件是.i 文件。gcc指令:gcc -E file.c -o file.i 编译:将预处理之后的.i 文件生成 .s 汇编文件。gcc指令:gcc -S file…

AI影像时代来临,联发科天玑以专业无畏精神重新定义手机专业影像

近期,联发科与Discovery探索频道联合举办了一场以“越极境,见芯境”为主题的天玑影像展,活动地点位于我国桂林阳朔。活动现场展示了阳朔壮美山水的画卷,以及救援队员在岩壁上进行训练的极限瞬间。令人意想不到的是,这些…

【课程系列01】某乎的AI大模型全栈工程师-第4期

网盘链接 链接:https://pan.baidu.com/s/1QLkRW_DmIm1q9XvNiOGwtQ --来自百度网盘超级会员v6的分享 课程目标 AI大模型全栈工程师是指具备人工智能领域全方位能力的工程师,特别是在大模型开发和应用方面具有深厚的专业知识和技能。以下是关于AI大模型…

第12章.STM32标准库简介

目录 0. 《STM32单片机自学教程》专栏 12.1 CMSIS 标准 12.2 STM32标准库文件结构 12.2.1 主结构 12.2.2 Libraries固件库文件 CMSIS文件夹 1.core_cm3.c&core_cm3.h 2.startup启动文件 3.Stm32f10x.h 4.system_stm32f10x.c&system_stm32f10…

Linux常用命令及或g++(或gcc)编辑器运用

一. 实验内容 1.打开VMware Workstation虚拟机进入Ubuntu系统,打开终端。 练习使用常用的Linux命令,主要包括如下命令: mkdir, rmdir, cd, pwd, ls, clear, cat, rm等。(其中,cat、rm命令请在下面实验内容3…

IIC通信总线

文章目录 1. IIC总线协议1. IIC简介2. IIC时序1. 数据有效性2. 起始信号和终止信号3. 数据格式4. 应答和非应答信号5. 时钟同步6. 写数据和读数据 2. AT24C023. AT24C02读写时序4. AT24C02配置步骤5. 代码部分1. IIC基本信号2. AT24C02驱动代码3. 实验结果分析 1. IIC总线协议 …

【C++提高编程-05】----C++之Deque容器实战

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

MySQL的三种重要的日志

日志 Mysql有三大日志系统 Undo Log(回滚日志):记录修改前的数据,用于事务回滚和 MVCC(多版本并发控制)。 Redo Log(重做日志):记录数据变更,用于崩溃恢复&…

【java】指定类,指定package,找到package下面,这个类的所有子类

目录 ■java代码 ■注意 ■运行效果 ■包的结构 ■java代码 package com.sxz.study.reflect;import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List;public class …

缓存技术实战[一文讲透!](Redis、Ecache等常用缓存原理介绍及实战)

目录 文章目录 目录缓存简介工作原理缓存分类1.按照技术层次分类2.按照应用场景分类3.按照缓存策略分类 应用场景1.硬件缓存2.软件缓存数据库缓存Web开发应用层缓存 3.分布式缓存4.微服务架构5.移动端应用6.大数据处理7.游戏开发 缓存优点缓存带来的问题 常见常用Java缓存技术1…

Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity 之通过自定义协议从浏览器启动本地应用程序 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进…

树莓派等Linux开发板上使用 SSD1306 OLED 屏幕,bullseye系统 ubuntu,debian

Raspberry Pi OS Bullseye 最近发布了,随之而来的是许多改进,但其中大部分都在引擎盖下。没有那么多视觉差异,最明显的可能是新的默认桌面背景,现在是大坝或湖泊上的日落。https://www.the-diy-life.com/add-an-oled-stats-display-to-raspberry-pi-os-bullseye/ 通过这次操…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 特惠寿司(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 特惠寿司(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…