【Mac】编译Spring 源码和Idea导入

今天我们开始Spring源码的阅读之旅。阅读Spring的源码的第一步当然是编译Spring源码。首先我们要去GitHub上将spring源码给clone下来。

笔者编译环境如下:

Spring版本:5.28
https://github.com/spring-projects/spring-framework/tree/v5.2.8.RELEASE
https://github.com/spring-projects/spring-framework/wiki/Build-from-Source

根据官网的编译文档可知我们需要的JDK版本
自行配置
在这里插入图片描述
根据源码路径
spring-framework\gradle\wrapper\gradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionUrl=file\:/Users/xxxx/Source/gradle-8.3/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

我们知道当前源码需要的gradle版本以及需要的gradle配置
下载对应的gradle
https://gradle.org/releases/
配置mac环境变量

GRADLE_USER_HOME=/Users/king/JavaLibrary/gradle-8.3
export GRADLE_USER_HOME

还需要在源码上方位置更换成本地gradle

distributionUrl=file\:/Users/xxxx/Source/gradle-8.3/gradle-8.3-bin.zip

进行编译

./gradlew build

发生如下错误

Caused by: org.gradle.jvm.toolchain.internal.NoToolchainAvailableException: No matching toolchains found for requested specification: {languageVersion=21, vendor=any, implementation=vendor-specific} for MAC_OS on x86_64.at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.downloadToolchain(JavaToolchainQueryService.java:180)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.lambda$query$2(JavaToolchainQueryService.java:146)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.query(JavaToolchainQueryService.java:146)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.lambda$resolveToolchain$1(JavaToolchainQueryService.java:124)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.resolveToolchain(JavaToolchainQueryService.java:122)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.lambda$findMatchingToolchain$0(JavaToolchainQueryService.java:103)at org.gradle.api.internal.provider.DefaultProvider.calculateOwnValue(DefaultProvider.java:72)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.WithSideEffectProvider.calculateOwnValue(WithSideEffectProvider.java:54)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:82)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:82)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.AbstractMinimalProvider.withFinalValue(AbstractMinimalProvider.java:164)at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:133)at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:26)at org.gradle.api.interna

解决方案
找到项目中 spring-core文件夹中的spring-core.gradle文件中下面这行代码将21去掉即可!!!
修改前

multiRelease {targetVersions 17 , 21
}

修改后

multiRelease {targetVersions 17
}

如果遇到编译测试类错误,多次编译就好
eg:
在这里插入图片描述
最终会编译成功
在这里插入图片描述
执行下边命令

./gradlew :spring-oxm:compileTestJava

首先我们要对idea进行一些设置,具体如下
在这里插入图片描述
然后选择已存在的源进行导入
在这里插入图片描述
然后选中原来的项目。具体如下:
在这里插入图片描述
记住上面要选build.gradle文件,然后等待idea建立好缓存
在这里插入图片描述
这个时候我们需要修改如下的设置,具体如下:
在这里插入图片描述
然后我们需要修改运行的配置为idea运行,不然每次idea运行都会通过gradle去编译运行——gradle运行编译特别慢;需要改成idea自己编译运行。具体如下:
在这里插入图片描述
再次说明一下这里不是一定要改,但是如果你不改用默认的则会特别慢,改成idea快的不止一点点。

改完之后便可以建一个子model来测试了,但是一定得建gradle的项目,因为spring源码这个父项目就是用gradle来开发的

在这里插入图片描述
在这里插入图片描述

然后创建好添加以下的依赖。

api(project(":spring-context"))

在这里插入图片描述
然后开始开始完善项目的其他

配置类的代码

package com.ys;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.ys")
public class AppConfig {
}

service的代码

package com.ys;import org.springframework.stereotype.Component;@Component
public class IndexService {
}

测试类的代码

package com.ys;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext ac =new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(ac.getBean(IndexService.class));}
}

然后点击运行。
在这里插入图片描述
可以看到我们Spring的源码就编译成功,同时测试也成功了。

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

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

相关文章

人工智能项目集合推荐(数据集 模型训练 C++和Android部署)

人工智能项目集合推荐(数据集 模型训练 C和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人体检测 ★人体姿态估计(人体关键点检测) ★头部朝向估计 …

【C++初阶】模拟实现list

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

nginx配置站点强制开启https

当站点域名配置完SSL证书后,如果要强制开启HTTPS,可以在站点配置文件中加上: #HTTP_TO_HTTPS_START if ($server_port !~ 443){rewrite ^(/.*)$ https://$host$1 permanent; } #HTTP_TO_HTTPS_END 附上完整的配置完SSL证书,强制…

W18.4、单元测试

一、目标: 1. 提高代码质量 2. 提高提测质量 3. 降低联调成本 4. 减少修改代码引入新问题 二、单元测试要点 1. 编写独立的测试类:为每个要测试的类编写一个对应的测试类,保持测试代码与实际代码分离。 2. 测试代码覆盖率:尽量确保对实际代码的所有分支和边界情况…

Consul的简介与安装

1、Consul简介 Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发,Consul提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服…

Node.js怎么搭建HTTP服务器

在 Node.js 中搭建一个简单的 HTTP 服务器非常容易。以下是一个基本的示例,演示如何使用 Node.js 创建一个简单的 HTTP 服务器: // 导入 http 模块 const http require(http); // 创建一个 HTTP 服务器 const server http.createServer((req, res) …

Docker容器与虚拟化技术:GitHub账户注册

目录 一、实验 1.GitHub 一、实验 1.GitHub (1)GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。 (2)官网 GitHub: Let’s build from here …

DQL语句的用法(MySQL)

文章目录 前言一、DQL语句间接和语法1、DQL简介2、DQL语法 二、DQL语句使用1、基础查询(1)查询多个字段(2)为字段设置别名(3)去除重复记录 总结 前言 本文主要介绍SQL语句中DQL语句的功能和使用方法&#…

乐趣无限:10款基于Pygame的经典游戏合集

​​​​​​引言 游戏开发一直是许多程序员和游戏爱好者追求的梦想。而Pygame作为一款功能强大的游戏开发库,为我们提供了实现各种有趣游戏的工具和接口。在本文中,我将向大家介绍10款基于Pygame的经典游戏合集,从简单的猜数字到刺激的飞机…

本地私有仓库、harbor私有仓库部署与管理

本地私有仓库、harbor私有仓库部署与管理 一、本地私有仓库1.本地私有仓库简介2.搭建本地私有仓库3.容器重启策略介绍 二、harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3.Harbor的构成4.harbor部署及配置5.客户端测试 三、Harbor维护1.创建2.普通用户操作私有仓库3.日…

一个mongodb问题分析

mongodb问题分析 现状 表的个数: 生产上常用的表就10来个。 sharding cluster replica set方式部署: 9个shard server, 每个shard server 1主2从, 大量数据写入时或对大表创建索引时,可能有主从复制延迟问题。实…

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点,并计算…

C#,《小白学程序》第四课:数学计算

1 文本格式 /// <summary> /// 《小白学程序》第四课&#xff1a;数学计算 /// 这节课超级简单&#xff0c;就是计算成绩的平均值&#xff08;平均分&#xff09; /// 这个是老师们经常做的一件事。 /// </summary> /// <param name"sender"></…

管理类联考——英语——实战篇——大作文——图表——动态图表——第三段

第一句:Given all above arguments, it admits of no doubt that this tendency of 主题词2 will continue in the forthcoming years. 翻译:从以上我们的讨论来看,我们可以预测主题词2这一趋势在未来几年内仍将继续。 [备注1]:本句为趋势预测句,不需要说明…

【操作记录】CLion 中引入 Gurobi 并使用 C++ 编程

文章目录 一、前言二、具体操作2.1 创建项目2.2 修改编译工具2.3 修改 CMakeLists.txt2.4 修改 main.cpp2.5 运行测试 一、前言 虽然C编程大部分人都会选择使用VS&#xff0c;但是作为 IDEA 的长期用户&#xff0c;我还是比较习惯 JetBrains 风格的编译器&#xff0c;所以就选…

YARN资源管理框架论述

一、简介 为了实现一个Hadoop集群的集群共享、可伸缩性和可靠性&#xff0c;并消除早期MapReduce框架中的JobTracker性能瓶颈&#xff0c;开源社区引入了统一的资源管理框架YARN。 YARN是将JobTracker的两个主要功能&#xff08;资源管理和作业调度/监控&#xff09;分离&…

Scikit-Learn中的特征选择和特征提取详解

概要 机器学习在现代技术中扮演着越来越重要的角色。不论是在商业界还是科学领域&#xff0c;机器学习都被广泛地应用。在机器学习的过程中&#xff0c;我们需要从原始数据中提取出有用的特征&#xff0c;以便训练出好的模型。但是&#xff0c;如何选择最佳的特征是一个关键问…

【Python PEP 笔记】201 - 同步迭代 / zip() 函数的使用方法

原文地址&#xff1a;https://peps.python.org/pep-0201/ PDF 地址&#xff1a; 什么是同步迭代 同步迭代就是用 for 一次循环多个序列。 类似于这样的东西&#xff1a; arr1 [1, 2, 3, 4] arr2 [a, b, c, d] for a, b in arr1, arr2:print(a, b)使用 map 实现 for a, b …

NFT Insider #104:The Sandbox:全新土地销售活动 Turkishverse 来袭

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

【广州华锐互动】VR沉浸式体验红军长征路:追寻红色记忆,传承红色精神

在历史的长河中&#xff0c;长征无疑是一段充满艰辛和英勇的伟大征程。为了让更多的人了解这段历史&#xff0c;我们利用虚拟现实&#xff08;VR&#xff09;技术&#xff0c;为您带来一场沉浸式的体验&#xff0c;重温红军万里长征的壮丽篇章。 一、踏上长征之路 戴上VR眼镜&a…