Spring源码分析专题系列(2)展开Spring源码构建之旅(利用IDEA和Gradle)

环境的搭建

  • Git

  • JDK8+master 分支需要 JDK 11

  • Spring源码仓库地址(5.2.x 分支):https://github.com/spring-projects/spring-framework

  • master 分支需要 JDK 11

  • IDEA

gradle组件

下载gradle

下载地址

image

如何安装Gradle此处省略,留一个传送门:Gradle

配置gradle

下载下来后解压

image

配置环境变量

GRADLE_HOME
image
GRADLE_USER_HOME
image
验证gradle
image

下载源码

clone 源码

image
git clone  https://github.com/spring-projects/spring-framework.git

当然可以参考一下相关的 gitclone、toolwa,这些镜像仓库,下载速度回更快一些

修改spring源码配置

Spring源码下载下来后,不着急导入idea,先修改几处配置

image

配置gradle的远程仓库

  • import-into-idea.md:这是官方提供的spring源码导入idea的步骤和注意说明,我已经翻译过了,可以移步:IDEA导入Spring源码调试必看
打开spring源码的gradle配置文件
image
修改settings.gradle文件

下载依赖的网络速度之不可描述原因,懂得人都懂,我们加上阿里云的maven仓库。

maven { url "https://maven.aliyun.com/repository/public" }
image
修改build.gradle文件

如下两处添加镜像源配置

配置阿里云仓库地址,在build.gradle文件的,在repositories配置项中添加阿里云仓库地址。

// 配置国内镜像源
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
image

image
修改gradle.properties文件

version=X.X.X-SNAPSHOT

设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出

org.gradle.jvmargs=-Xmx2048M

开启 Gradle 缓存

org.gradle.caching=true

开启并行编译

org.gradle.parallel=true

启用新的孵化模式

org.gradle.configureondemand=true

开启守护进程 通过开启守护进程,下一次构建的时候,将会连接这个守护进程进行构建,而不是重新fork一个gradle构建进程

org.gradle.daemon=true

修改好之后如下图所示:

image

配置源码使用的gradle版本

distributionUrl=file:///E:/yuanma/gradle-4.9-all.zip
image

这里的distributionUrl的值指向我们下载的gradle-4.9-all.zip压缩包

修改spring-beans.gradle文件配置
image

注释掉部分报错配置,替换成新的配置

def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues
compileGroovy.dependsOn = deps - "compileJava"
compileKotlin.dependsOn(compileGroovy)
compileKotlin.classpath += files(compileGroovy.destinationDir)

使用 IDEA 打开

等待IDEA加载完成即可。

git clone -b 5.2.x  https://github.com/spring-projects/spring-framework.git
image

注:也可以指定 clone 的分支或者先 fork 到自己的仓库,然后再clone。

执行测试

在项目右键创建 module

image

选择 Gradle Java

image

创建 module

image

在 build.gradle 中添加配置

compile(project(":spring-context"))
image

设置相关配置

image
image

例如可以加入JVM参数:

-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m


image
image
image

创建测试类并测试

其中 UserComponent 添加了 @Component 注解, 程序正常执行则一切 OK。可以开始愉快的调试代码了。

image

编译oxm、编译core

要编译整个spring的源码,我们需要预先编译 spring-oxm和spring-core,确保oxm和core模块编译成功后,即可编译spring整体

在gradle面板中找到如下按钮,点击即可编译oxm模块

image

编译结果如下

我这里因为已经编译过了,所以会比较快

image

同理,编译core模块

image

编译整个spring源码

确保oxm和core模块编译成功后,即可编译spring整体

image

结果如下:

image

到这里的话,其实spring的编译就完成了。项目的整体结构如下,并且各个模块在idea中都有一个蓝色的小标

image

验证

实践是检验真理的唯一标准,那么怎样验证我们上面的构建是否成功呢,很简单,写个demo测试一下就好了,下面进入验证过程。

  1. 在spring-framework-master项目下新建我们自己的测试module,如下图所示:
image
  1. 选择使用gradle


    image
  2. 输入自己的module名


    image
  3. 既然要验证,那我们肯定需要依赖spring的模块,我们在我们刚刚新建的模块下build.gradle文件中修改使用阿里云仓库,同时依赖spring-context等多个基础模块。

修改spring-自定义模块的build.gradle文件,新增依赖

compile(project(":spring-beans"))
compile(project(":spring-core"))
compile(project(":spring-context"))
compile(project(":spring-aop"))
image
  1. 刷新依赖,重新编译,速度同样飞快。
image
  1. 我们先写一个配置类
package com.libo.spring.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName: MazhichuConfig
* @Description: 配置
* @Author: Moore
* @Date: 2020-06-08 12:30
* @Version: V1.0
*/
@Configuration
@ComponentScan("com.libo")
public class MazhichuConfig {
}
  1. 写一个实体Bean
package com.mazhichu.spring.repository;

import org.springframework.stereotype.Repository;
/**
* @ClassName: Hello
* @Description: bean
* @Author: Moore
* @Date: 2020-06-08 12:30
* @Version: V1.0
*/
@Repository
public class Hello {
    public void hello(){
        System.out.println("Hello,ma_zhichu!");
    }
}

  1. 编写测试类,运行,如下图所示:
image

你可能感兴趣的:(Spring源码分析专题系列(2)展开Spring源码构建之旅(利用IDEA和Gradle))