1. 前言

最近想再次熟悉和研究了一下spring源碼,所以將spring源碼拉到本地編譯完成之後在源碼裏面直接寫註釋,也更方便了自己學習和調試。此記錄一下編譯的過程和遇到的問題。

2. 環境準備

本地編譯spring源碼我使用的個軟件版本如下:

  • 系統:Windows11
  • Idea:2024.01
  • Gradle:7.2
  • Spring-Framework: 5.3.10.RELEASE
  • Jdk:11

3. Spring編譯流程

3.1 安裝GRADLE

3.1.1 下載安裝GRADLE

可以去gradle官網下載所需版本的二進制包,我們選擇gradle-7.2即可。

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring

3.1.2 下載後解壓到指定的目錄中

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_maven_02

3.1.3 配置環境變量,新建GRADLE_HOME環境變量指向你的Gradle解壓路徑

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring源碼_03

3.1.4 將 %GRADLE_HOME%\bin添加到Path環境變量中,然後點擊確定

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_04

3.1.5 驗證gradle是否安裝成功,打開cmd命令行輸入 gradle -v

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_05

3.2 Spring源碼下載

在github上搜索spring-framework的官方源代碼:

git clone -b v5.3.10 https://github.com/spring-projects/spring-framework.git

3.3 修改編輯配置

import-into-idea.md,這是官方提供的spring源碼導入idea的步驟和注意説明,這裏我就不去翻譯了,只需要跟着後續的步驟操作就行。當然感興趣的話可以點擊文章閲讀一下人家已經翻譯完成的。

3.3.1 修改settings.gradle文件,加上我們國內的阿里雲maven倉庫。
maven { url "https://maven.aliyun.com/repository/public" }

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_06

3.3.2 修改gradle.properties文件
version=5.3.10
# 此處修改:增加內存分配
org.gradle.jvmargs=-Xmx2048M
org.gradle.caching=true
org.gradle.parallel=true
kotlin.stdlib.default.dependency=false
## 此處修改:啓用新的孵化模式
org.gradle.configureondemand=true
## 此處修改:開啓守護進程
org.gradle.daemon=true

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_07

3.3.3 修改build.gradle文件,加上使用阿里雲倉庫,提高下載速度。
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring源碼_08

3.4 開始構建

根據import-into-idea.md中寫到的要求,我們需要先進行兩次預編譯。

直接在下載代碼的目錄上進行CMD操作,並執行命令

3.4.1 預編譯spring-oxm

gradlew :spring-oxm:compileTestJava

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_09

3.4.2. 預編譯spring-core

gradlew :spring-core:compileTestJava

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_maven_10

3.5 導入IDEA

3.5.1 首先需要在idea中為新項目配置一下gradle的本地倉庫目錄,如果不配置的話,當你導入的時候idea會自動把依賴包下載到gradle默認目錄下。

操作路徑:File -> New Projects Settings ->Settings for New Projects

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring源碼_11

操作路徑:搜索"gradle"進行配置

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_maven_12

完成預編譯之後我們就終於可以把spring源碼導入IDEA了~~,通過IDEA中的File->Open操作

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring源碼_13

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_14

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_15

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_16

spring源碼的編譯終於成功了!接下來我們進行一下簡單的驗證。

4. 驗證

4.1.前置説明

在spring-context添加測試類,測試驗證是否能編譯通過,拿到實例的對象並且執行方法。

4.2.添加測試類

為了快速定位到,先添加測試的package: com.laihx.example.model, 創建Student實體類

package com.laihx.example.model;
public class Student {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

package: com.laihx.example.service, 創建StudentService類

package com.laihx.example.service;
import com.laihx.example.model.Student;
import org.springframework.stereotype.Service;
@Service
public class StudentService {
	public void test(){
		Student stu = new Student();
		stu.setName("測試");
		stu.setAge(18);
		System.out.println("Spring編譯驗證:"+stu.getName());
	}
}

4.3.測試配置文件

spring-test.xml ,目錄在test/resources,內容如下:

4.4.添加測試類

為了快速定位到,先添加測試的package: com.laihx.example , 創建MyTest類

package com.laihx.example;
import com.laihx.example.service.StudentService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
	@Test
	public void test() {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml");
		StudentService studentService = applicationContext.getBean("studentService", StudentService.class);
		studentService.test();
	}
}

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring_17

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_spring源碼_18

4.5 驗證測試

執行驗證結果!,沒有問題。

使用IDEA+Gradle構建Spring5源碼並調試(二)_idea debug gradle_java_maven_19

5. 遇見問題

最後再主要説一下在編譯過程中我遇到的一些問題。

錯誤: 程序包jdk.jfr不存在!
        這是jdk的版本不對,換成jdk11就不會出現這種問題,剛開始也確實用來JDK8的版本,報錯了調整了JDK11,Spring5.3.10使用JDK8大版本沒有問題,但是OpenJDK8且版本低於8u262,會缺失jdk.jfr 包,導致編譯錯誤!