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即可。
3.1.2 下載後解壓到指定的目錄中
3.1.3 配置環境變量,新建GRADLE_HOME環境變量指向你的Gradle解壓路徑
3.1.4 將 %GRADLE_HOME%\bin添加到Path環境變量中,然後點擊確定
3.1.5 驗證gradle是否安裝成功,打開cmd命令行輸入 gradle -v
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" }
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
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'}
3.4 開始構建
根據import-into-idea.md中寫到的要求,我們需要先進行兩次預編譯。
直接在下載代碼的目錄上進行CMD操作,並執行命令
3.4.1 預編譯spring-oxm
gradlew :spring-oxm:compileTestJava
3.4.2. 預編譯spring-core
gradlew :spring-core:compileTestJava
3.5 導入IDEA
3.5.1 首先需要在idea中為新項目配置一下gradle的本地倉庫目錄,如果不配置的話,當你導入的時候idea會自動把依賴包下載到gradle默認目錄下。
操作路徑:File -> New Projects Settings ->Settings for New Projects
操作路徑:搜索"gradle"進行配置
完成預編譯之後我們就終於可以把spring源碼導入IDEA了~~,通過IDEA中的File->Open操作
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();
}
}
4.5 驗證測試
執行驗證結果!,沒有問題。
5. 遇見問題
最後再主要説一下在編譯過程中我遇到的一些問題。
錯誤: 程序包jdk.jfr不存在!
這是jdk的版本不對,換成jdk11就不會出現這種問題,剛開始也確實用來JDK8的版本,報錯了調整了JDK11,Spring5.3.10使用JDK8大版本沒有問題,但是OpenJDK8且版本低於8u262,會缺失jdk.jfr包,導致編譯錯誤!