1.写在前面的话
碰到了不少想阅读或者学习spring源码的同学,但是第一步搭建这个源码阅读环境就能难倒了一大批人。下面我就以spring5.3.x这个源码分支,来具体演示一下搭建过程。
2. 下载源码
下载源码这一步,说实话,由于某些原因,会导致我们用git做clone的时候,老是中断,clone不下来。所以我们可以先把github的源码,复制到gitee上,然后从gitee上来下载。
- 打开spring的在github的源码地址:https://spring.io/projects/spring-framework
- 复制git的clone地址:https://github.com/spring-projects/spring-framework.git
- 打开gitee:https://gitee.com/,登录完成后,点击右上角的从Github/GitLab导入仓库
- 在Git 仓库URL中输入spring源码的clone地址,点击导入,稍微等一会,就完成了。
这样我们就把spring源码导入到自己的gitee仓库中,方便我们日后学习过程的中的文件提交。 - 在本地将spring源码从我们的gitee代码库中clone下来:
git clone -b 5.3.x https://gitee.com/xxxx/spring-framework.git
- 稍等一下,源码就下载成功了。
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_HOME | D:\javaenv\gradle-7.5.1 |
GRADLE_USER_HOME | D:\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的源码就搭建成功了,可以进行学习和研究。从上面的步骤来看,其实还是很复杂的,尤其的环境,会出现各种意向不到的问题。这里只是我的一个搭建过程,可能大家在自己电脑上搭建还会遇到其他的一些问题,这里就需要自行解决了。