写点什么

(序)【Spring 源码专题】展开 Spring 源码构建之旅(利用 IDEA 和 Gradle)

发布于: 2 小时前
(序)【Spring源码专题】展开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

下载地址



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

配置 gradle

下载下来后解压

配置环境变量

GRADLE_HOME
GRADLE_USER_HOME


验证 gradle


下载源码

clone 源码


git clone  https://github.com/spring-projects/spring-framework.git
复制代码


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

修改 spring 源码配置

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


配置 gradle 的远程仓库

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

打开 spring 源码的 gradle 配置文件
修改 settings.gradle 文件

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


maven { url "https://maven.aliyun.com/repository/public" }
复制代码


修改 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'}
复制代码




修改 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


修改好之后如下图所示:



配置源码使用的 gradle 版本

distributionUrl=file:///E:/yuanma/gradle-4.9-all.zip
复制代码



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

修改 spring-beans.gradle 文件配置


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


def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValuescompileGroovy.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
复制代码



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

执行测试

在项目右键创建 module

选择 Gradle Java

创建 module


在 build.gradle 中添加配置


compile(project(":spring-context"))
复制代码


设置相关配置



例如可以加入 JVM 参数:


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







创建测试类并测试

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


编译 oxm、编译 core

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


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


编译结果如下

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


同理,编译 core 模块

编译整个 spring 源码

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



结果如下:



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



验证

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


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



  1. 选择使用 gradle


  1. 输入自己的 module 名



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

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


compile(project(":spring-beans"))compile(project(":spring-core"))compile(project(":spring-context"))compile(project(":spring-aop"))
复制代码



  1. 刷新依赖,重新编译,速度同样飞快。



  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*/@Repositorypublic class Hello { public void hello(){ System.out.println("Hello,ma_zhichu!"); }}
复制代码


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



针对于一些出现的问题:可以参考一下:【spring】 spring-5.0.x源码本地编译 (juejin.cn)


发布于: 2 小时前阅读数: 5
用户头像

我们始于迷惘,终于更高水平的迷惘。 2020.03.25 加入

🏆 【酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“】 🏅 【Java技术领域,MySQL技术领域,APM全链路追踪技术及微服务、分布式方向的技术体系等】 🤝未来我们希望可以共同进步🤝

评论

发布
暂无评论
(序)【Spring源码专题】展开Spring源码构建之旅(利用IDEA和Gradle)