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

news2025/2/5 2:50:08

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

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

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

相关文章

STM32控制DS18B20温度传感器获取温度

时间记录:2024/1/28 一、DS18B20温度传感器介绍 (1)测温范围-55℃~125℃,在-10℃到85℃范围内误差为0.4 (2)返回的温度数据为16位二进制数据 (3)STM32和DS18B20通信使用单总线协议…

算法模板 3.二分查找

二分查找 789. 数的范围 - AcWing题库 check函数&#xff08;lr&#xff08;这里要不要1&#xff09;&#xff09;>> 1 &#xff0c;要根据具体情况&#xff0c;如果是r mid的话lr就不用1&#xff0c;l mid的话就要1 #include <bits/stdc.h> using namespace s…

Android Retrofit添加header参数

前言 有些接口需要单独设置header参数 作为标记 如何灵活 或者统一设置请求header呢 注解Headers 顾名思义 Headers是指多个header 放在对象里 统一管理 //获取xxx Headers({"Content-Type: application/json","User-Agent: test"}) POST("xxxx&q…

小程序:类型三级分类

一、效果图片 二、代码 <template><view class"customPosition"><!-- header --><navBar :border"false" :hasBack"true" :title"titleName"></navBar><!-- 查询 --><view class"search…

JavaWeb之打包失败解决方案

情况描述&#xff1a; ---打包不成功 这时点击Maven中的蓝色小闪电&#xff1a; 小闪电的意思&#xff1a;是否跳过测试。点击选中就可以跳过&#xff0c;打包的时候就可以跳过测试代码。 再次打包后即可成功&#xff1a; 查看具体打包后的jar包&#xff1a; 打包后&#x…

openGaussdb5.0单点企业版部署_Centos7_x86

本文档环境&#xff1a;CentOS7.9 x86_64 4G1C40G python2.7.5 交互式初始化环境方式 介绍 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验&#xff0c;结合企业级场景需求&#xff0c;持续…

Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)

文章目录 1. Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic aarch64)2. 三个链接是官方提供的文档、管理工具和技术支持3. System information as of Thu 01 Feb 2024 03:30:45 PM HKT4. System load: 1.16&#xff1a;系统负载指数5. Processes: 1096系统正在运…

虹科技术|一文详解IO-Link Wireless技术如何影响工业无线自动化

导读&#xff1a;在工业无线自动化的飞速发展进程中&#xff0c;IO-Link Wireless技术成为了一项具有颠覆性的创新。它将IO-Link协议与无线连接完美结合&#xff0c;解决了传统通信技术在工业应用中的痛点。本文将深入解析IO-Link Wireless技术的原理、应用领域、优势以及实际案…

vue3集成video.js

就长这个样子&#xff0c;该有的功能都有了 首先安装 npm install video.js 然后创建一个vue文件 <template><div class"full" style"padding: 10px;overflow: auto;"><video :id"videoId" class"video-js"><…

LeetCode.1686. 石子游戏 VI

题目 题目链接 分析 本题采取贪心的策略 我们先假设只有两个石头a,b&#xff0c; 对于 Alice 价值分别为 a1,a2&#xff0c; 对于 Bob 价值而言价值分别是 b1,b2 第一种方案是 Alice取第一个&#xff0c;Bob 取第二个&#xff0c;Alice与Bob的价值差是 c1 a1 - b1&#xf…

Django模型(八)

一、修改数据 先获取对象,通过对象属性更新数据,再保存 (更新单一数据)通过QuerySet的update函数更新数据 (更新多条数据) #单条记录修改 save c = Cook.objects.get(pk=1) c.name = 安妮 c.save()# 更新多个值 update Cook.objects.filter(sect=粤菜).update(level=5)1.1、…

游戏APP开发:从创意到实现的全过程

随着智能手机的普及和移动互联网的发展&#xff0c;游戏APP市场日益繁荣。游戏APP开发已经成为一个热门行业&#xff0c;吸引了众多开发者和创业者的关注。本文将介绍游戏APP开发的全过程&#xff0c;包括创意、策划、设计、开发、测试和发布等环节。 一、创意 游戏APP开发的…

测试access和trunk口的区别(华为)

思科设备参考&#xff1a;测试access和trunk口的区别&#xff08;思科&#xff09; 一&#xff0c;实验目的 实现同一 Vlan 内的主机互通&#xff0c;不同 Vlan 间的主机隔离。 二&#xff0c;配置前测试 PC1分别ping PC2、PC3、PC4都能通&#xff0c;因为四台PC默认同处于v…

2024年美赛F题Problem F Reducing Illegal Wildlife Trade减少非法野生动物贸易的完整思路代码分享

非法的野生动物贸易会对我们的环境产生负面影响&#xff0c;并威胁到全球的生物多样性。据估计&#xff0c;它每年涉及高达265亿美元&#xff0c;被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目&#xff0c;旨在显著减少非法野生动物贸易。你的目标是说服一个…

2024 美国大学生数学建模竞赛 美赛(D题)五大湖水资源调配问题 国际大学生数学建模竞赛| 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍希望大家都能轻松建模呀&#xff0c;华数杯也会持续给大家放送思路滴~ 抓紧小秘籍&#xff0c;我们出发吧~ 完整内容可以在文章末尾领取&#xff01; 问题一&#xff1a;建立一个包括五大湖和连接从苏必利尔湖到大西洋的河流的…

软件工程(最简式总结)

目录 第一章:概述 1.软件危机的表现原因 2.常见的软件开发方法包括&#xff1a; 3.软件工程基本原则 4.软件工程三要素 5.设计模式的分类 6.针对变换型数据流设计步骤 7.针对事务型数据流设计步骤 第二章&#xff1a;软件过程 1.软件生命周期 2.软件过程模型 &…

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中&#xff0c;scope的默认值是compile。 scope的分类 compile&#xff08;默认&#xff09; 含义&#xff1a; compile 是默认值&#xff0c;如果没有指定 scope 值&#xff0c;该元素…

SpringBoot引入主盘探活定时任务

主盘探活通常是指检查存储设备&#xff08;例如硬盘&#xff09;是否可读写&#xff0c;但在Java中并没有直接针对硬件级别的磁盘探活API。然而&#xff0c;我们可以模拟一个场景&#xff0c;即检查某个目录或文件是否可以被Java程序正常读写&#xff0c;以此作为主盘活跃的一个…

OSPF 协议

OSPF 开放式最短路径优先协议 形容&#xff1a; 无类别链路状态协议&#xff1a; 无类别 ---- 存在掩码 IGP 内部网关协议 动态路由协议 一、链路状态协议(LS) OSPF 协议 隶属于 链路状态协议。 区别&#xff1a; 距离矢量协议(DV)&#xff1a;运行距离矢量协议的路由器…

2024数学建模美赛C题详细代码思路手把手教学

问题分析 问题围绕2023年温网男单决赛中&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉兹击败36岁的诺瓦克德约科维奇的比赛。德约科维奇自2013年以来首次在温布尔登输球&#xff0c;结束了他在大满贯赛事中的杰出表现。这场比赛被认为是一场精彩的较量&#xff0c;经历了多次势头…