spring学习之路-spring源码环境构建

647 阅读4分钟

最近准备去学习一下spring源码,想要学习源码当然要先把源码的环境搞出来,本来觉得应该不复杂,结果两天来,下载了5个版本gradle,spring源码从5.0x尝试到master,终于构建成功了!刚完事就想到赶紧分享给也正在构建的小伙伴,那就开始吧。

一、环境准备

1、JDK版本选择

建议1.8版本以上,笔者的JDK版本

image.png

2、gradle下载安装

spring源码是基于Gradle构建的,所以当然要先配置gradle环境了。

( 1 ) 官方下载地址:services.gradle.org/distributio…

( 2 ) 这时候聪明的小伙伴就要问了,gradle那么多版本,我下载那个呀!这个要去你下载spring源码根目录gradle\wrapper下的gradle-wrapper.properties文件中进行查看。

image.png

比如笔者下载spring源码中gradle版本是4.1.1,所以下载该版本即可。这里其实下载bin版本就行,不过建议下载all版本,这个版本可以查看gradle源码。

( 3 ) 安装配置环境变量

1)下载后解压缩,新增系统环境变量: GRADLE_HOME

image.png

2)新增path : %GRADLE_HOME%\bin

3)验证gradle是否配置成功,输入 gradle -v

image.png

出现如图所示及表示安装成功。

3、spring源码下载

( 1 )可以去很多代码仓库下载源码,比如Github、Gitee、开源中国等。

笔者这里选择的是github,不为别的就想看看自己网速给不给力。网速不好的可以选择Gitee、开源中国的代码库。

源码下载地址: github.com/spring-proj…

image.png

进入页面选择5.0.x分支,这里要强调一下,网上很多教程说先Fork到自己库,再通过git地址下载,这里有一个问题,你不管git下载的哪个版本分支,gradle-wrapper.properties、build.gradle都会是一样的,所以一定要选择好分支版本后,通过zip下载。

4、idea版本 2020.1

二、配置

1、修改spring源码根目录gradle\wrapper\gradle-wrapper.properties文件,修改后配置如下

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#distributionUrl=https://services.gradle.org/distributions/gradle-4.4.1-bin.zip
distributionUrl=file:///D:/Gradle/gradle-4.4.1-all.zip

这样每次打开项目就不会从官网下载了,直接读取本地gradle。

2、在spring源码根目录build.gradle文件中添加阿里云镜像,添加后的文件如下:

头部位置

buildscript {
   repositories {
      maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}
      maven{ url "http://maven.aliyun.com/nexus/content/repositories/jcenter"}
      gradlePluginPortal()
      maven { url "https://repo.spring.io/plugins-release" }
   }
   dependencies {
      classpath("io.spring.gradle:propdeps-plugin:0.0.9.RELEASE")
      classpath("io.spring.gradle:docbook-reference-plugin:0.3.1")
      classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16")
      classpath("org.asciidoctor:asciidoctorj-epub3:1.5.0-alpha.7")
   }
}

搜索repositories

repositories {
   maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}
   maven{ url "http://maven.aliyun.com/nexus/content/repositories/jcenter"}
   mavenCentral()
   maven { url "https://repo.spring.io/libs-spring-framework-build" }
}

3、打开idea,随便打开个项目,配置gradle

image.png

gradle user home :本地gradle仓库位置,建议配置下,默认会下载jar包到c盘

4、打开spring源码,用open打开即可

image.png

打开后配置下jdk,不然build.gradle会有地方报错。 file->project Structure (快捷键ctrl+alt+shift+s)

image.png 改为本地jdk

image.png

三、下载依赖

以上配置完成后,就可以点击刷新,下载依赖了。

image.png

因为spring依赖的包相当的多,所以这个过程可能会比较长,有实力的小伙伴可以搞一个科学上网工具。

下载完成后就可以进入最后一步、也是最麻烦的一步项目编译了。

四、项目编译

1、准备工作

打开spring源码根目录gradle/docs.gradle文件

注释掉dokka、asciidoctor代码块

image.png

因为spring源码是在linux系统上开发的,linux文件目录跟window是不一样的,所以需要修改task schemaZip这块代码,这里直接注释原代码,粘贴新的即可。

task schemaZip(type: Zip) {
   group = "Distribution"
   baseName = "spring-framework"
   classifier = "schema"
   description = "Builds -${classifier} archive containing all " +
         "XSDs for deployment at http://springframework.org/schema."
   duplicatesStrategy 'exclude'

   //当前系统是否是windows的标志
   def isWindows = System.properties['os.name'].toUpperCase().contains('WINDOWS')

   //不同的操作系统,表示子目录的符号是不同的
   def schemaPath = isWindows ? "META-INF\spring.schemas" : "META-INF/spring.schemas"

   moduleProjects.each { subproject ->
      def Properties schemas = new Properties();

      subproject.sourceSets.main.resources.find {
         it.path.endsWith(schemaPath)
      }?.withInputStream { schemas.load(it) }

      for (def key : schemas.keySet()) {
         def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')
         assert shortName != key
         File xsdFile = subproject.sourceSets.main.resources.find {
            //如果是windows环境,就要对路径中的分隔符做替换
            isWindows ? it.path.endsWith(schemas.get(key).replaceAll('\/','\\')) : it.path.endsWith(schemas.get(key))
         }
         assert xsdFile != null
         into (shortName) {
            from xsdFile.path
         }
      }
   }
}

2、执行编译

其实spring源码有提供idea构建的文档,有兴趣的可以打开根目录下import-into-idea.md 了解一下。

image.png

按照上面说的先编译spring-oxm

image.png

双击运行complieTestJava 执行编译的过程中,可能由于网络问题导致失败,重新执行即可。

3、去掉spring-sapects 模块

笔者是去除了spring-sapects 模块的,有一些文档也说不用去除,不过还是建议去除。

image.png

image.png

4、编译spring-core

image.png

双击运行complieTestJava进行编译

image.png

恭喜 你又离成功近了一步。

5、全局编译

image.png

这个编译的时间可能会比较慢一些,不要着急,喝点咖啡,刷会微博,耐心等待肯定会成功的。

如果成功了,恭喜你,已经基本完成了spring源码的构建,接下来简单测试下是否真正成功了

五、测试

新建模块 File -> New -> Module

image.png

选择Gradle项目,然后next

image.png

新建完成后,打开新模块目录下的build.gradle文件,添加依赖

dependencies {

    compile(project(":spring-beans"))
    compile(project(":spring-core"))
    compile(project(":spring-aop"))
    compile(project(":spring-context"))
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

1)在模块下新建配置类BaseConfig

image.png

2)新建类X

image.png

3)新建测试类

image.png

运行测试类main方法

image.png

成功输出X类构造方法和hello方法。

到这里为止,恭喜你已经成功构建出spring源码学习环境