spring源码系列(六)——番外篇如何编译spring的源码

学习spring源码的第一步便是需要去编译源码;很多网友在编译spring源码的时候遇到了困难继而放弃了spring源码的学习;
这篇文章主要来阐述如何正确的编译spring源码;首先你得检查你的网线能正常上网;最好网速还行;不然你会疯掉

下载spring源码

下载spring源码可以选择github或者码云(国内的);下载方式可以选择git clone 或者直接下载一个zip包;笔者推荐使用git clone这种方式;我在本地的d:workspace下面clone了spring5.1.x的源码(写文章的时候spring已经有了5.2了,版本你自己选择)

在这里插入图片描述

阅读spring的编译文档

如何编译spring的源码其实spring提供了详细的文档;离线版和在线版都有(离线版在我们下过来的源码当中的README.md);这里我们选择在线版作为参考吧;在github上spring-framework这个项目的底下有一个build from source的章节

在这里插入图片描述

点击这个链接之后就是构建编译spring源码的文档
编译文档地址 https://github.com/spring-projects/spring-framework/wiki/Build-from-Source

在这里插入图片描述

本文中我会参考这个文档来重新编译一个spring5.1.x的源码;按照文档说的首先你得具备一个jdk8以上的环境;笔者使用的是jdk11;然后通过git clond一份源码下来;这个事情我们已经做完了;继而到项目的根目录运行 ./gradlew build但是文档上是linux命令,如果是windows系统其实我可以看到项目的根目录下面有个gradlew.bat的文件;可以直接运行这个文件(不建议双击直接运行,因为如果有错误你看不到,建议通过cmd去运行这样就能看到他提示的错误);

其实我们不着急去运行这个文件;运行这个命令spring会首先去下载一个gradle到你本地,然后通过gradle去编译spring源码;为什么运行这个命令会自动下载gradle呢?从哪下载呢?版本是什么呢?

首先看看这个命令的是否存在根目录

在这里插入图片描述

上述gradlew.bat就是等下我们需要运行的命令;但是先不着急运行;因为这个命令回去读取一个文件;在这个文件当中配置了gradle的版本和下载地址;一旦运行变化自动下载;有时候会下载不过来;而且有时候可能需要等等,就算下载过来了目录在哪里也是他自动指定的,下载过来后解压目录等等都是在那个文件里面配置了;索性我们自己下载过来然后修改这个配置文件;
0、配置文件的位置——D:workspacespring-frameworkgradlewrappergradle-wrapper.properties
1、可以修改这个下载地址——默认是一个http的url;如果你自己下载过来后可以修改为自己的本地目录
2、下载后的存放目录、以及解压目录都可以修改——但是不建议修改可以使用默认的

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=file:///d:/tools/java/gradle-6.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

distributionBase 下载之后的目录(从distributionUrl下载过来是一个zip文件,存放的目录)
GRADLE_USER_HOME 如果是windows系统默认问c:Users你的用户.gradle
distributionPath 会自动拼接 distributionBase
zipStoreBase 是解压目录

上述配置的大概意思就是如果我们运行gradlew.bat 会自动去 file:///d:/tools/java/gradle-6.5.1-bin.zip这个目录下载一个gradle到C:Usersjava_.gradlewrapperdists然后解压到C:Usersjava_.gradlewrapperdists;但是实际目录不是这个,这个命令还会自己生成一些目录;下图是笔者电脑实际gradle的解压目录

在这里插入图片描述

但是关于gradle-6.5.1-bin.zip这个文件哪里能下载,可以自己百度;当然也可以从笔者的网盘上下载
链接:https://pan.baidu.com/s/1CyfaZvBGBczJ8QSj66JFKA 提取码:5qvd

在这里插入图片描述

改完这个配置也不要急着运行命令编译;因为当自动下载完gradle之后会通过gradle去编译spring源码;这里就涉及到一个gradle的中央仓库的问题了,编译过程中会下载大量的依赖;如果你采用默认的依赖那么这个编译过程一定特别漫长;而且会失败;于是我们需要修改中央仓库为国内的阿里云;这样就会快很多;如何修改呢?

找到项目根目录的build.gradle文件,打开并且编辑添加阿里云的仓库

在这里插入图片描述

repositories {
			mavenCentral()
			maven { url "https://repo.spring.io/libs-spring-framework-build" }
			maven { url "https://repo.spring.io/snapshot" } // Reactor
			maven {url 'https://maven.aliyun.com/nexus/content/groups/public/'} //阿里云
			maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
		}

至此万事具备只欠东风了,cmd到项目根目录运行gradlew.bat(当然这些优化是笔者自己总结出来的,如果你的网速够快你完全可以不用优化,直接运行那个命令);

在这里插入图片描述

这个过程会相当漫长取决于你的网速;我再截几张笔者编译过程中的图

在这里插入图片描述

这个结果可能会最后显示失败;如果显示失败就再运行一遍gradlew.bat直到他编译成功;下图是显示编译成功的结果

在这里插入图片描述

编译成功后就可以导入idea了(一共用了36分钟;差不多一个子路的时间);至于文档上说的publishToMavenLocal这些操作可以不用;如何导入idea他也提供了文档
导入idea的文档地址:https://github.com/spring-projects/spring-framework/blob/master/import-into-idea.md

在这里插入图片描述

根据文档的提示在导入idea之前需要去Precompile spring-oxm也就是预编译 oxm这个项目;运行gradlew :spring-oxm:compileTestJava

在这里插入图片描述
这个预编译很快笔者的破电脑38s便编译完了;

导入idea

导入之前你随便打开一个项目,然后在该项目当中对idea进行一些设置(当然如果你知道如何去对idea进行全局设置可以不必要打开一个项目)

在这里插入图片描述
这个设置尤为重要特别是第二个设置一定要指定前面我们自动下载过来解压的gradle;不然又会下载一遍jar;

设置完成之后开始把源码导入到idea
在这里插入图片描述

选择项目的目录;继而选择根目录当中的build.gradle文件导入

在这里插入图片描述

导入idea之后会开始建立索引这个过程也是很漫长,你只能等,大概10-20分钟吧;看电脑性能

在这里插入图片描述

正确构建之后如下图

在这里插入图片描述
接下来要对idea进行设置,不然每次idea运行都会通过gradle去编译运行——gradle运行编译特别慢;需要改成idea自己编译运行

在这里插入图片描述

再次说明一下这里不是一定要改,但是如果你不改用默认的则会特别慢,改成idea快的不止一点点

改完之后便可以建一个子model来测试了,但是一定得建gradle的项目,因为spring源码这个父项目就是用gradle来开发的

在这里插入图片描述

在这里插入图片描述

建好项目之后再gradle的配置文件中添加spring的依赖——相当于你建了一个maven项目,在pom文件中添加spring的依赖;

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

在这里插入图片描述
然后开始开始完善项目的其他类

配置类的代码

@Configuration
@ComponentScan("com.shadow")
public class AppConfig {
//扫描com.shadow包下面的所有bean
}

service的代码

@Component
public class IndexService {
}

测试类的代码

public class ShadowTest {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext
				ac
				= new AnnotationConfigApplicationContext(AppConfig.class);
		System.out.println(ac.getBean(IndexService.class));
	}
}

右键运行——可能你会出现一些错误;比如博主这里就出现了某些类找不到的错误

在这里插入图片描述

遇到这种问题是因为这个类所在的项目没有编译这个类——说白了就是没有产生class文件;比如上图那个错误便是没有找到 InstrumentationSavingAgent 这个类,那么你首先找到这个类所在的项目(InstrumentationSavingAgent类所在的项目为spring-instrument);再看看out文件下面是不是有这个class;比如博主这里连out文件夹没有——build文件下下面是gradle产生的,我们上面已经把编译方式改成了idea,idea默认编译文件为out——说白了就是这个build可以直接删除;out文件夹都没有表示这个项目当中的java类idea压根没有编译;我们可以运行这个项目下面的测试类test让idea去帮我们编译这些java类

在这里插入图片描述

上图可以看到我已经吧build文件删除了;找到test文件夹下面的java文件夹右键 run all tests

在这里插入图片描述

遇到其他问题也类似这种办法解决,最后再次运行我们自己的main方法;

在这里插入图片描述
一些正常;spring5.1.x的源码编译导入idea完成

最近比较忙二宝刚出生;看完如果觉得对你有帮助点赞评论都是支持博主更新的动力,我会尽快出下一篇spring的源码的文章

最后大家B搜索一下**“边境线java”** 这是我个人的b站账号,我会在上面一直更新一些java技术

你可能感兴趣的:(java,java,后端)