idea搭建spring5.3.x源码环境

1.写在前面的话

碰到了不少想阅读或者学习spring源码的同学,但是第一步搭建这个源码阅读环境就能难倒了一大批人。下面我就以spring5.3.x这个源码分支,来具体演示一下搭建过程。

2. 下载源码

下载源码这一步,说实话,由于某些原因,会导致我们用git做clone的时候,老是中断,clone不下来。所以我们可以先把github的源码,复制到gitee上,然后从gitee上来下载。

  1. 打开spring的在github的源码地址:https://spring.io/projects/spring-framework
  2. 复制git的clone地址:https://github.com/spring-projects/spring-framework.git
  3. 打开gitee:https://gitee.com/,登录完成后,点击右上角的从Github/GitLab导入仓库
    在这里插入图片描述
  4. 在Git 仓库URL中输入spring源码的clone地址,点击导入,稍微等一会,就完成了。
    在这里插入图片描述
    这样我们就把spring源码导入到自己的gitee仓库中,方便我们日后学习过程的中的文件提交。
  5. 在本地将spring源码从我们的gitee代码库中clone下来:
git clone -b 5.3.x https://gitee.com/xxxx/spring-framework.git
  1. 稍等一下,源码就下载成功了。

3. 安装gradle

3.1 确定gradle的版本

因为spring源码是用gradle构建的,所以我们要先安装gradle。特别注意的是,gradle的版本必须和spring源码中要求的一致,否则会报错。版本信息在源码中的位置:
D:\studyspace\spring-framework-5.3.x\spring-framework\gradle\wrapper\gradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

这里我们看到使用的是7.5.1这个版本。

3.2 下载gradle

从https://gradle.org/releases/ 选择的版本7.5.1下载。
在这里插入图片描述

3.2 解压安装gradle

在本机上某个目录下解压下载的gradle,这里我放到了
D:\javaenv\gradle-7.5.1 这个目录下。
然后再这个目录下,新建.gradle,即:D:\javaenv\gradle-7.5.1.gradle
在这里插入图片描述

3.3 创建初始化文件,配置仓库地址

在init.d文件夹下创建gradle初始化配置文件:init.gradle,然后在这个文件配置仓库地址。
D:\javaenv\gradle-7.5.1\init.d
在这里插入图片描述
在这个文件下,创建init.gradle,内容如下:

allprojects{
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/repository/public/' }
        maven { url 'https://maven.aliyun.com/repository/jcenter/' }
        maven { url 'https://maven.aliyun.com/repository/google/' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
        maven { url 'https://jitpack.io/' }
        maven { url "https://maven.aliyun.com/repository/spring/" }
    }
}

settingsEvaluated { settings ->
    settings.pluginManagement {
        // Clear repositories collection
        repositories.clear()
        // Add my Artifactory mirror
        repositories {
            mavenLocal()
            maven {
                url 'https://maven.aliyun.com/repository/gradle-plugin/'
            }
        }
    }
}

这里一定要注意,必须配置https://maven.aliyun.com/repository/spring/。这里说一下原因吧。
我们在导入Spring源码时,总是无法下载com.ibm.websphere:uow:6.0.2.17包,如果我们换上https://repo.spring.io/libs-release 这个仓库地址的话,会报401错误,没有认证。如果我们使用阿里云的https://maven.aliyun.com/repository/public/这个仓库,会找不到这个包。那为什么在public下会找不到这个包呢?
因为发现public仓库并不包含spring仓库,所以需要增加https://maven.aliyun.com/repository/spring这个仓库地址。

3.4 配置gradle环境配置

这里我就以我的电脑为例,说一下需要配置的参数,具体操作自己去配就行了,很简单。
第一个参数:

参数
GRADLE_HOMED:\javaenv\gradle-7.5.1
GRADLE_USER_HOMED:\javaenv\gradle-7.5.1.gradle
path里加上gradle命令路径:%GRADLE_HOME%\bin

3.5 验证gradle

gradle --version

在这里插入图片描述
这样gradle就配置完成了。

4. 配置idea环境

1.用idea打开spring源码,这时基本上会自动下载项目所需要的包,但是我们还没有配置好我们的idea,所以暂时先将build都停止掉;
2.配置project Structure 中的jdk版本,这里我使用的是jdk8
在这里插入图片描述
在这里插入图片描述
3.安装aspectj编译插件(spring-aop和spring-aspects项目需要此插件编译)
在idea的Settings中,找到Plugins,搜索AspectJ
在这里插入图片描述
在这里插入图片描述
4.安装AspectJ
1.aspectj的下载地址如下:
https://www.eclipse.org/aspectj/downloads.php,这里我选择最新的一个包下载
在这里插入图片描述
这里我下载到了D:\javaenv 目录下
在这里插入图片描述
右键打开终端,执行

java -jar aspectj-1.9.6.jar

在这里插入图片描述
这时会弹出选择
2.选择下一步
在这里插入图片描述
选择jdk
在这里插入图片描述
在D:\javaenv新建目录aspectj1.9,然后下一步,选择
在这里插入图片描述
然后选择Install,安装完成。
5.在idea中配置aspectj编译环境,注意:这里需要重新启动idea,否则上面aspectj插件不生效。
在idea的Settings中的Java Compiler,将Use compiler 设置为Ajc;同时在Ajc Options也做响应的配置,如下图所示:
在这里插入图片描述
6.将spring-aop和spring-aspects两个module,添加aspect编译环境
在这里插入图片描述
由于我这里已经配置过了,所以看不到选项。配置完如下:
在这里插入图片描述
7.在idea中配置gradle仓库
在这里插入图片描述
8.修改项目中的中央仓库配置,共三个位置
第一个位置:D:\studyspace\spring-framework-5.3.x\spring-framework\buildSrc 下的build.gradle
配置如下:
在这里插入图片描述

repositories {
	mavenLocal()
	maven { url 'https://maven.aliyun.com/repository/public/' }
	maven { url 'https://maven.aliyun.com/repository/jcenter/' }
	maven { url 'https://maven.aliyun.com/repository/google/' }
	maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
	maven { url 'https://jitpack.io/' }
	maven { url "https://maven.aliyun.com/repository/spring/" }
	mavenCentral()
	gradlePluginPortal()
}

第二个位置:D:\studyspace\spring-framework-5.3.x\spring-framework,源码目录下的settings.gradle
在这里插入图片描述

pluginManagement {
	repositories {
		mavenLocal()
		maven { url 'https://maven.aliyun.com/repository/public/' }
		maven { url 'https://maven.aliyun.com/repository/jcenter/' }
		maven { url 'https://maven.aliyun.com/repository/google/' }
		maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
		maven { url 'https://jitpack.io/' }
		maven { url "https://maven.aliyun.com/repository/spring/" }
		mavenCentral()
		gradlePluginPortal()
	}
}

第三个位置:D:\studyspace\spring-framework-5.3.x\spring-framework,源码目录下的build.gradle

在这里插入图片描述

repositories {
			mavenLocal()
			maven { url 'https://maven.aliyun.com/repository/public/' }
			maven { url 'https://maven.aliyun.com/repository/jcenter/' }
			maven { url 'https://maven.aliyun.com/repository/google/' }
			maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
			maven { url 'https://jitpack.io/' }
			maven { url "https://maven.aliyun.com/repository/spring/" }
			mavenCentral()
			gradlePluginPortal()
		}

5. 编译工程

5.1 下载依赖

点击idea右边的gradle,刷新gradle,等待所有依赖下载完毕
在这里插入图片描述

5.2 编译spring-oxm子项目

执行spring—>spring-oxm—>task-other下的compileTestJava插件
在这里插入图片描述

5.3 编译整个工程

执行spring—>Tasks—>build下的build插件
在这里插入图片描述
等待几分钟编译完毕即可。
但是在编译过程中还可能会出现各种错误,这时候我们可以多build几次,实在不行,就重启下idea,再次build就会成功。

6.测试

6.1 新建gradle的module

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

6.2 给新建的spring-study的添加依赖

在这里插入图片描述

dependencies {
    api(project(":spring-beans"))
    api(project(":spring-core"))
    api(project(":spring-tx"))
    api(project(":spring-aop"))
    api(project(":spring-context"))
    api(project(":spring-expression:"))
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

6.3 创建测试代码

1.创建Student类,
在这里插入图片描述

package org.springframework.study.domain;

/**
 * @author lxc
 * @createTime 2024-02-01 16:06
 * @description
 */
public class Student {

	/**
	 * id编号
	 */
	private Long id;

	/**
	 * 姓名
	 */
	private String name;

	/**
	 * 年龄
	 */
	private Integer age;


	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student{" +
				"id=" + id +
				", name='" + name + '\'' +
				", age=" + age +
				'}';
	}
}

2.在Main中编写main方法测试
在这里插入图片描述

package org.springframework;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.study.domain.Student;

public class Main {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Student student = context.getBean("student", Student.class);
		System.out.println(student);
	}
}

3.查看结果
在这里插入图片描述

6.小结

这样我们整个spring的源码就搭建成功了,可以进行学习和研究。从上面的步骤来看,其实还是很复杂的,尤其的环境,会出现各种意向不到的问题。这里只是我的一个搭建过程,可能大家在自己电脑上搭建还会遇到其他的一些问题,这里就需要自行解决了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django模板(一)

一、基本规则 作为一个Web框架,Django需要一种方便的方式来动态生成HTML。最常用的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述如何插入动态内容的特殊语法 1.1、django默认模板 在settings中配置: TEMPLATES = [{BACKEND: django.template.backends.django.…

基于 Echarts 的 Python 图表库:Pyecahrts交互式的日历图和3D柱状图

文章目录 概述一、日历图和柱状图介绍1. 日历图基本概述2. 日历图使用场景3. 柱状图基本概述4. 柱状图使用场景 二、代码实例1. Pyecharts绘制日历图2. Pyecharts绘制2D柱状图3. Pyecharts绘制3D柱状图 总结 概述 本文将引领读者深入了解数据可视化领域中的两个强大工具&#…

数据解构+算法(第07篇):动态编程!黄袍加身!

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

力扣hot100 对称二叉树 递归

Problem: 101. 对称二叉树 文章目录 思路Code 思路 👨‍🏫 参考 Code 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

【10秒开服】雾锁王国服务器全自动部署教程

你是火焰之子,一个濒死种族最后的希望火苗。苏醒吧,克服腐化一切的迷雾所裹挟的恐怖,重新夺回你的王国所失落的瑰丽。置身于广袤世界,战胜难以想象的强大Boss,修造宏伟厅堂,在这款至多16名玩家的合作类生存…

sectigo ip ssl证书有哪些

Sectigo是移交成立时间较久的CA认证机构,几十年来在全球颁发了各种各样的数字证书,例如,单域名SSL证书、多域名SSL证书、通配符SSL证书等域名SSL证书。Sectigo旗下也有一些不常见的数字证书,例如,代码签名证书、IP证书…

HTTP中传输协议的数据格式

HTTP 概述:超文本传输协议(Hyper Text Transfer Protocol) 传输协议:定义了客户端和服务器通信时,发送数据的格式 客户端和服务器端交互:客户端向服务器端发送请求,服务器端向客户端响应请求 HTTP特点:…

【RT-DETR有效改进】利用YOLO-MS的MSBlock模块改进ResNet中的Bottleneck(RT-DETR深度改进)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块(其其实不能算是Conv但是其应该是一整个模块),我们将其用于替换我们ResNet中Basic组合出一种新的结构,来替换我们网络中的…

【Bugs】Jmeter报错:NoSuchMethodError: org.apache.jmeter.samplers.

报错情况 Jmeter版本:5.4.3 报错场景:在线程组中添加了jpgc - PerfMon Metrics Collector性能监控组件后出现报错。 Jmeter中无法运行测试,cmd命令行中出现以下报错。 cmd报错详细内容: Uncaught Exception java.lang.NoSuchMe…

Mac 上终端配置

Mac 上终端配置 初始化了一下自己的 mac 笔记本,所以重新记一下终端配置,最终的完成版的需求是这样的: 存在的指令需要显示绿色进行提示: 不存在的指令则是显示红色进行提示: 同时具备对指令进行提示 一个看起来…

spark window源码探索

核心类: 1. WindowExec 物理执行逻辑入口,主要doExecute()和父类WindowExecBase 2. WindowFunctionFrame 窗框执行抽象,其子类对应sql语句的不同窗框 其中又抽象出BoundOrdering类, 用于判断一行是否在界限内(Bound), 分为RowBoundOrdering…

2024美赛MCM 问题 C 网球运动的动量(Momentum in Tennis)

2024 MCM Problem C: Momentum in Tennis In the 2023 Wimbledon Gentlemen’s final, 20-year-old Spanish rising star Carlos Alcaraz defeated 36-year-old Novak Djokovic. The loss was Djokovic’s first at Wimbledon since 2013 and ended a remarkable run for one o…

直播团队职责

一、内容策划 直播团队的内容策划人员是整个直播活动的核心,他们需要负责策划直播的主题、内容、形式以及时间安排等。同时,他们还需要负责邀请嘉宾、安排活动等,确保直播内容丰富、有趣、有价值。 二、主播管理 主播是直播活动的关键人物…

提升CKA考试胜算:一文带你全面了解RBAC权限控制!

RBAC概述 RBAC引入了四个新的顶级资源对象。Role、ClusterRole、RoleBinding、 ClusterRoleBinding。同其他 API 资源对象一样,用户可以使用 kubectl 或者 API 调用等 方式操作这些资源对象。kubernetes集群相关所有的交互都通过apiserver来完成,对于这…

计算机网络第4章(网络层)

4.1、网络层概述 简介 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输 这些异构型网络N1~N7如果只是需要各自内部通信,他们只要实现各自的物理层和数据链路层即可 但是如果要将这些异构型网络互连起来,形成一个更大的互…

《云原生安全攻防》-- 云原生安全概述

从本节课程开始,我们将正式踏上云原生安全的学习之旅。在深入探讨云原生安全的相关概念之前,让我们先对云原生有一个全面的认识。 什么是云原生呢? 云原生(Cloud Native)是一个组合词,我们把它拆分为云和原生两个词来…

存内计算芯片研究进展及应用—以基于NorFlash的卷积神经网络量化及部署研究突出存内计算特性

文章目录 存内计算的背景存算一体技术发展历程 存内计算芯片研究现状SRAM存内计算DRAM存内计算ReRAM/PCM存内计算MRAM存内计算NOR Flash存内计算 基于 NOR Flash 的卷积神经网络量化卷积神经网络基本结构卷积神经网络量化方法研究实验及结果分析心得 参考文献 如果我能看得更远…

C语言基础:头歌练习数组练习

(字符串插入) 任务描述 题目描述:输入两个字符串a和b,将b串中的最大字符插入到a串中最小字符后面。 样例输入: MynameisAmy MynameisJane 样例输出: MynameisAymy 题目分析:a字符串中最小的字符是A…

HTML+CSS:全景轮播

效果演示 实现了一个简单的网页布局,其中包含了五个不同的盒子,每个盒子都有一个不同的背景图片,并且它们之间有一些间距。当鼠标悬停在某个盒子上时,它的背景图片会变暗,并且文字会变成白色。这些盒子和按钮都被放在一…

安科瑞智能微型断路器在某银行网点的设计与应用

【摘要】:随着人工智能、移动互联等现代信息技术和通信技术在电力行业的应用,实现电力系统各个环节人机交互、万物互联,打造状态全方面感知、信息合理处理、应用便捷灵活的泛在电力物联网已成为必然趋势。本文主要对智能微型断路器在银行网点…