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

环境的搭建

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

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

修改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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容