天天看點

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

Spring架構的重要程度不言而喻!

在嘗試閱讀Spring源碼時,在第一步搭建環境上被勸退很多次(确實比較複雜),而且網上搜了很多部落格、文章後發現,不是Spring版本老,就是Gradle或者Idea版本老。于是昨天肝到深夜,參考了很多資料,終于搭建成功了Spring5.3.x版本的源碼環境!

在分析Spring架構源碼之前,首先要搭建起來Spring的源碼環境,由于Spring源碼并不是托管于maven的,而是托管于Gradle,是以我們需要先下載下傳版Gradle,此外還額外需要本機電腦組態JDK11環境(必須是11,否則Spring源碼環境編譯過不去)。下面我們就從安裝環境開始:

先統一下環境版本要求:

Spring源碼版本5.x

Gradle6.4.x及其以上版本

Jdk11(最好是11,jdk8也可以,但是不敢保證一遍成功)

一、JDK11 安裝

下載下傳與安裝

Oracle官方下載下傳位址:

https://www.oracle.com/java/technologies/javase-jdk11-downloads.html

我的電腦是Win10,是以下載下傳下面這個安裝包:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 如果官網下載下傳速度慢,這裡提供一個百度雲連結: https://pan.baidu.com/s/1LOUVsO2orCUtKRdjOKqGCA ,提取碼:qqo5
  • 下載下傳完成後執行exe安裝包,自己選一個安裝路徑(我的是預設路徑),點選下一步:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 等待安裝完成:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

配置環境變量

  • 右鍵 -> 我的電腦 -> 屬性:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 選擇 -> 進階系統設定 -> 環境變量:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 選擇建立系統環境變量JAVA_HOME:

變量名:JAVA_HOME

變量值:jdk安裝的位址(我使用的是預設位址:C:\Program Files\Java\jdk-11.0.6)

注意:如果本機安裝由jdk8 的環境,這裡隻需要找到JAVA_HOME并将變量值修改為jdk11的安裝路徑即可~

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

在系統環境變量CLASSPATH中新增如下内容:

  • 變量名: CLASSPATH
  • 變量值:

    .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

  • 注意,一定不要忽略了前面的英文句号

    .

    啊!
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 最後一步,找到系統變量中的Path,加入如下内容:
  • %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

點選确定,并通過

cmd

 檢視環境變量配置是否生效:

java -version

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

JDK8更換JDK11遇到的問題:

更換JDK版本後,修改環境變量,cmd檢視版本時仍為jdk8的解決辦法:

https://blog.csdn.net/qq_26369317/article/details/80922425

二、Gradle5.6.3 的安裝

下載下傳位址:

https://services.gradle.org/distributions/

gradle-x.x-bin.zip是需要下載下傳的安裝釋出版(使用這個就行!注意:這裡建議大家下載下傳Gradle6.4.x的版本,在寫這篇文章的時候我采用的是Gradle5.6.3這個版本,後來有些粉絲私信反應Spring5.3.x,用Gradle5.x的版本好像會有一些問題,但是不是每個人都出問題,是以為了順應新版本的Spring,建議盡量采用6.x版本的Gradle!)

gradle-x.x-src.zip是源碼

gradle-x.x-all.zip則是下載下傳全部的檔案

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

下載下傳完畢後,在自己指定的磁盤中建立Gradle檔案夾,并将下載下傳的壓縮包解壓到該檔案夾中:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

如下圖所示:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

下載下傳解壓完畢後,去進行環境變量的配置,gradle的配置類似于maven和jdk的配置:

右鍵 -> 我的電腦 –> 屬性 –> 進階系統設定 –> 環境變量 –> 系統變量:

在系統變量中新增一個GRADLE_HOME,其值為解壓後的路徑(我的是F:\Gradle\gradle-5.6.3-all\gradle-5.6.3)

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 然後,修改系統Path變量,在Path變量添加

    %GRADLE_HOME%\bin

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

點選确定,然後就通過

cmd

指令去測試一下是否配置成功:

gradle -v

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

檢視到gradle的版本資訊,配置成功~

建立Gradle的本地jar包倉庫檔案夾

  • 在我們解壓gradle的檔案夾下執行

    cmd

    指令:

    mkdir .gradle

  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 則,我們建立的.gradle檔案夾就是用來存放所下載下傳的jar包倉庫主目錄!配置Gradle鏡像在Gradle安裝目錄下的 init.d 檔案夾下,建立一個 init.gradle 檔案:

  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 在該檔案裡面填寫以下配置:

allprojects{
    repositories {
        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
        all { ArtifactRepository repo ->
            def url = repo.url.toString()
            if ((repo instanceof MavenArtifactRepository) && (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com'))) {
                project.logger.lifecycle 'Repository ${repo.url} replaced by $REPOSITORY_URL .'
                remove repo
            }
        }
        maven {
            url REPOSITORY_URL
        }
    }
}
      

三、IDEA中配置Gradle,并搭建Spring源碼環境

IDEA克隆Spring代碼倉庫

GitHub托管的Spring項目位址:

https://github.com/spring-projects/spring-framework

使用HTTPS的方式克隆:

https://github.com.cnpmjs.org/spring-projects/spring-framework.git
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

打開IDEA:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 從遠端GitHub倉庫,将Spring項目源碼克隆到本機:
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 點選克隆等待克隆完畢,項目初始化,當初始化完成後,如果出現如下情況:
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

說明IDEA未配置Gradle,以及Gradle鏡像!請接着往下操作:

IDEA配置Gradle

  • 打開IDEA -> setting -> Build,Execution,Deployment -> Build Tools -> Gradle,如下:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 配置修改如下:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 設定成功後,再繼續往下配置:

修改Spring項目源碼中Gradle相關配置

主要修改的地方如下幾個檔案:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
    1. import-into-idea.md

      :這是官方提供的spring源碼導入idea的步驟和注意說明,可以移步: IDEA導入Spring源碼調試必看 了解一下!
  • 2.修改

    settings.gradle

    檔案,下載下傳依賴的網絡速度之不可描述原因,這裡需要加上阿裡雲的maven鏡像倉庫:
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url "https://maven.aliyun.com/repository/public" }
      

修改好之後如下圖所示:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

3.修改

gradle.properties

檔案,都已經加了詳細注釋:

version=5.3.0-SNAPSHOT
## 設定此參數主要是編譯下載下傳包會占用大量的記憶體,可能會記憶體溢出
org.gradle.jvmargs=-Xmx2048M
## 開啟 Gradle 緩存
org.gradle.caching=true
## 開啟并行編譯
org.gradle.parallel=true
## 啟用新的孵化模式
org.gradle.configureondemand=true
## 開啟守護程序 通過開啟守護程序,下一次建構的時候,将會連接配接這個守護程序進行建構,而不是重新fork一個gradle建構程序
org.gradle.daemon=true
      
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

4.修改

build.gradle

檔案,加上使用阿裡雲倉庫,提高下載下傳速度:

repositories {
    // 新增2個阿裡鏡像位址
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
    mavenCentral()
    maven { url "https://repo.spring.io/libs-spring-framework-build" }
    // 新增spring插件庫
    maven { url "https://repo.spring.io/plugins-release"}
}
      
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 5.這裡還需要再改一個地方,就是如下位置中的

    gradle-wrapper.properties

    檔案:
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

這個壓縮包也可以自己下載下傳,不用6.8.3版本的,用自己下載下傳的版本也可以。我這裡用6.8.3版本的壓縮包,是因為,Spring5.3.8源碼預設用的是6.8.3版本的gradle!

Spring源碼的建構、編譯

在Spring源碼的本機位置,打開cmd,執行指令:gradlew :spring-oxm:compileTestJava,去預編譯spring-oxm子產品!

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

等待指令執行結束:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

同上,預編譯spring-core子產品,執行指令

gradlew :spring-core:compileTestJava

,并等待指令執行結束:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

到這兒,使用IDEA + Gradle建構Spring5源碼就已經全部完成。

四、源碼環境驗證

最後一部,就是去驗證一下我們搭建的Spring源碼環境是否可以正常運作:

簡單測試:Spring源碼給我們提供了測試環境搭建是否正常的包,測試運作spring-context子產品下的test包:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

執行結果如下圖:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

功能測試:自己建立一個子產品去測試Spring源碼的功能。在spring-framework項目下建立我們自己的測試module,如下圖所示:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

等待子產品建立完畢後,向子子產品的

build.gradle

檔案指定位置加入如下代碼:

compile(project(":spring-context"))
compile("org.aspectj:aspectjrt:1.9.5")
compile("org.aspectj:aspectjweaver:1.9.5")
      

如下圖:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

這裡其實就相當于maven工程的pom.xml檔案,加入上述代碼的目的是為了在子子產品my-spring-test中引入spring-context子產品的依賴。

  • 為子子產品建立java目錄結構(IDEA可以自動生成)New -> Directory:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 自動建立如下三個子產品:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 建立完成後結果如下圖:
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
  • 在java包下建立com.myspring.test包,并建立相關測試類以及spring配置檔案:

測試主函數類:

/**
 * date: 2021/5/13
 * @author csp
 * 測試主函數類
 */
public class Main {
    public static void main(String[] args) {
        // 讀取spring配置檔案
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-test.xml");

        // 擷取service的bean對象
        UserService userService = (UserService) context.getBean("userService");

        // 執行service方法查詢user對象
        User user = userService.getUserById(1);

        // 輸出user結果
        System.out.println(user);
    }
}
      

User實體類:

/**
 * date: 2021/5/13
 *
 * @author csp
 * User實體類
 */
public class User {
    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;
    }

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

service接口:

/**
 * date: 2021/5/13
 * @author csp
 * service接口
 */
public interface UserService {
    User getUserById(int id);
}
      

service接口實作類:

/**
 * date: 2021/5/13
 * @author csp
 * service接口實作類
 */
public class UserServiceImpl implements UserService {
    @Override
    public User getUserById(int id) {
        User user = new User();
        user.setAge(22);
        user.setName("興趣使然の草帽路飛");
        return user;
    }
}
      

resources下建立spring配置檔案spring-text.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--xml的方式将UserServiceImpl注入ioc容器-->
    <bean id="userService" class="com.myspring.test.UserServiceImpl"/>
</beans>
      

測試運作,輸出如下結果,說明環境搭建沒有問題了:

超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境

參考文章:

https://www.cnblogs.com/mazhichu/p/13163979.html
  • 本篇是Spring源碼系列第一篇,後續會陸續更新,如果對大家有幫助,請三連支援一下!
  • 如果搭建出現問題,歡迎評論區留言,及時幫大家解決!
  • 超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境