windwos环境下优雅配置gradle、下载spring源码并编译

2,000 阅读6分钟

写在前面

  • 很多人想学习源码,或者在b站、慕课网等跟着视频学习源码的时候,想跟着调试,注释spring源码。但是很多时候配置不好环境,这样学习效率不高,心里也很不爽,打击学习积极性。
  • 本篇文章主要是本地搭建spring源码环境,我也参考了很多博客以及官方文档,此处主要是想写一篇能够稳定实现本地编译源码的环境,避免很多初学者走弯路。

1、下载spring源码

使用下载地址(windows本地配置git就不说了):

	git clone https://gitee.com/mirrors/spring-framework.git

说明

  • 很多人说要稳定版本,我直接用上面连接git下来,一般是最新版本,照样可以用,这里如果只是用来自学,没什么问题。

2、配置本地gradle

  • 有两种方法:

1、手动下载gradle二进制包,这个就不细讲,google、百度随便一下就有完整教程,大致说一下步骤:

  • 点击下载gradle releases版本,也有文章说要4.几的稳定版本版本,我就用最新的,没问题!!!
  • 配置GRADLE_HOME、GRADLE_USER_HOME环境变量,并添加到path中去
  • (建议)提前打开idea把gradle配置好,这里我先不说怎么配,因为第二个方法才是我推荐的。

2、(推荐)使用Scoop下载和管理gradle

推荐原因

1、可以随时把gradle更新到最新版本,方便管理。
2、可以像在Linux环境下一样下载东西,类似python的pip
3、执行一个命令就ok。不需要手动下载二进制包

操作说明

1、首先安装Scoop。

ps:打开windows power shell(这个时候不得不推荐丢弃windows自带命令提示符(就那个windows R + cmd),在windows应用商城搜索windwos Terminal,更好用)

如下:

1、powershell给当前账号赋予执行下载命令的权限:

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

2、指定scoop的安装位置(是两行命令)

$env:SCOOP='D:\Applications\Scoop'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')

3、指定scoop下载软件的位置

$env:SCOOP_GLOBAL='F:\GlobalScoopApps'
[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')

4、下载scoop

Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

# or shorter
iwr -useb get.scoop.sh | iex

5、下载aria2,官方说明:

Scoop can utilize aria2 to use multi-connection downloads. Simply install aria2 through Scoop and it will be used for all downloads afterward.

也就是帮助你在使用scoop的时候下载加速

  • 如果下载很慢还是先搞个梯子把这个下载了,后面就不管了
scoop install aria2

2、下载gradle和配置(如果你按照上述执行完毕,在下载完aria2之后会看到绿色的下载完成的命令提示)

1、使用scoop下载gradle(一般会下载最新版本)

scoop install gardle

接着等着下载完成。就这么简单,爽不爽,反正我用了只有真香,后面还有:

2、把gradle更新到最新版本:

scoop update gradle

这时候会提示gradle已经是最新版本。

这里有一个需要说明的是,我配置好了scoop下软件安装的位置,然而还是没有按照我的目录安装,反而是安装在scoop的子目录下:

===================================分隔符====================================

3、这个时候在配置gradle的环境变量,同方法一所说的三步。我自己配好的结果如下:

到这里我们整理一下:1、spring源码下载好了,gradle安装好了(注意:并不是配置好了)

4、配置gralde的镜像仓库,在gradle的根目录下--->init.d目录----->点进去----->创建一个名为init.gradle的文件

在文件中添加如下json格式的maven镜像仓库路径

allprojects {
       repositories {
       maven {
           url "https://maven.aliyun.com/repository/public"
       }
       maven {
           url "https://maven.aliyun.com/repository/jcenter"
       }
       maven {
           url "https://maven.aliyun.com/repository/spring"
       }
       maven {
           url "https://maven.aliyun.com/repository/spring-plugin"
       }
       maven {
           url "https://maven.aliyun.com/repository/gradle-plugin"
       }
       maven {
           url "https://maven.aliyun.com/repository/google"
       }
       maven {
           url "https://maven.aliyun.com/repository/grails-core"
       }
       maven {
           url "https://maven.aliyun.com/repository/apache-snapshots"
       }
   }
}

ctrl + s之后,基本上ok了,检验gradle安装好的办法就是:命令行执行如下命令,查看是否安装好

gradle -v

接下来我们需要配置idea的gradle

3、配置idea的gradle

  • 打开已有工程,如果是已有的gradle工程最好(既然前面gradle都教你配置了,肯定默认你没有gradle工程,从头来) 1、 首先我们要新创建一个gralde工程,new---》project,进行如下选择:

阿里镜像路径:
https://start.aliyun.com

2、 紧接着,下一步,选择gradle项目:

后面跟着默认随便创建就好了,只是用来配置gradle

3、 创建好之后,在idea的右侧,点击gradle图标:

4、 进入gradle设置页面

通过以上配置前期准备就完成了,下一步可以编译本地spring源码了。

编译spring源码(我这里只讲命令行编译的,不踩坑)

1、先把坑填了

在spring源码目录下除了源码部分,还有有这么几个文件和事情需要我们注意:

  • gradle目录
  • gradlew.bat windows批处理命令
  • 在spring-oxm目录中有一个编译命令叫:gradlew :spring-oxm:compileTestJava

不管是命令行编译还是idea编译,在执行编译命令的时候,不管你本地有没有gradle,命令行都会执行下载gradle。 这个时候通常由于网络的原因,都会下载失败,很多人都卡在这一步(各种网络原因timeout):

下面填坑

  • 既然要下载,那我就先给你下载好。
  • 打开gradle目录下的wrapper目录下的gradle-wrapper.properties文件

查看此时配置中会下载什么版本的gradle,然后我们到最开始给的gradle网站去下载对应的gradle二进制包,解压到没有中文的目录下(!!!!注意一定是没有中文) 然后再把配置中的下载路径改为本地的(我个人的配置):

distributionUrl=file\:///D:/PRO-gradle/spring-framework/gradle/wrapper/gradle-6.7.1-bin.zip
其中: D:\PRO-gradle\spring-framework\gradle\wrapper是我放自己下载gradle的本地路径

到此,坑填了

2、编译代码

1、打开windows Terminal,然后cd 到spring源码目录下,即:D:\PRO-gradle\spring-framework>(我自己的源码目录)

2、执行预编译命令:

gradlew.bat

当出现如下图所示,显示编译成功时,即证明编译成功

3、为了保险起见,再执行一下命令(与spring-oxm目录下的内容对应):

gradlew :spring-oxm:compileTestJava

如果上述两部都执行成功,即编译成功,接下来,导入idea

3、导入idea

  • 按照官网所说,需要new--->project from existing sources方式进行导入

  • 进入到如下界面:

  • 然后按照之前idea中配置的gradle那样,检查一下gradle是否是之前配置好的内容,如果不是,及时改成正确的。

这时idea会本地加载,一般要不了多久,下面,讲一下本地调试

4、本地调试

1、在当前工程创建一个module

2、创建一个gralde module

后面自己喜好配置

3、在build.gradle中添加如下内容:

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

4、创建如下三个类:

1、配置类,添加扫描范围

  • 注意扫描范围根据自己创建的包路径来,一开始不会自动导入ComponentScan和Configuration不要着急,也不要去做任何瞎操作,一步一步来
package com.self.learn.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.self")
public class AppConfig {
//扫描com.self包下面的所有bean
}

2、添加一个bean

@Component
public class IndexService {

	public IndexService() {
		System.out.println("初始化IdenxService");
	}
}

3、添加测试类

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

OK,大功告成,如果上述没法根据提示导入spring对应包和类,直接运行gradle编译几遍,然后,就可以导入了

总结

  • 完全小白操作了,跟着这个编译,因该没有任何问题,然后就可以debug,修改本地注释了😁