Spring5.x源码分析 | 从踩坑到放弃之环境搭建

Posted Eshare分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring5.x源码分析 | 从踩坑到放弃之环境搭建相关的知识,希望对你有一定的参考价值。

Spring5.x源码分析——从踩坑到放弃之环境搭建


前言

自从Spring发行4.x后,很久没去好好看过Spring源码了,加上最近半年工作都是偏管理和参与设计为主,在技术细节上或多或少有点疏忽,最近心血来潮想重新下Spring源码,对以往Spring知识点做下回顾,但是在构建环境的过程中出现各种问题,一个个坑修复后,最终还是成功把单测运行成功,没有报编译错误或者其他异常,总结了以下一些环境搭建步骤,希望大家搭建过程都顺顺利利,踏上Spring源码分析之旅!


Spring5.x整体架构回顾

第一、前期运行环境与工具准备

  • JDK版本:1.8.0_161

  • GRADLE版本:4.9

    • 配置教程:https://www.cnblogs.com/linkstar/p/7899191.html

  • Spring源码版本:v5.0.8.RELEASE

  • IntelliJ IDEA版本:IntelliJ IDEA 2018.2.1 (Ultimate Edition)

  • 系统:WINDOWS 10


第二、下载源码

下载源码可以直接到Spring源码仓库 下载v5.0.8.RELEASE版本的zip包在本地解压,也可以通过fork方式把它fork到自己仓库,方便后续更新维护。 我已经配置好了,如果不想麻烦的同学可以直接到我的github拉取Spring源码https://github.com/Evan43789596/eshare-spring-framework,记得切换到 ftr_spring_learning分支

Spring5.x源码分析 | 从踩坑到放弃之环境搭建

下载到本地解压如下:

Spring5.x源码分析 | 从踩坑到放弃之环境搭建


上图用红框圈出来的几个文件要重点关注下:-

  • build.gradle 放了一些依赖配置,有点像maven的pom文件

  • gradle.properties 存放当前Spring的版本,可以对比下看看是不是5.0.8版本

  • gradlew.bat 放的是项目的构建脚本,不过在本章用不上,本章是使用IDEA去构建

  • import-into-idea.md 这个是Spring导入IDEA的说明文件,可以根据里面的步骤去导入


第三、导入IDEA

1.点击File->Open打开项目

Spring5.x源码分析 | 从踩坑到放弃之环境搭建

下载的jar包会存放在上图配置的路径:

Spring5.x源码分析 | 从踩坑到放弃之环境搭建



2.修改docs.gradle文件

如果是在我的github仓库下载的源代码包,可以忽略这一步,我已经配置好了。

打开docs.gradle文件

Spring5.x源码分析 | 从踩坑到放弃之环境搭建



3.注释掉dokka和asciidoctor两个配置项

Spring5.x源码分析 | 从踩坑到放弃之环境搭建

为什么要注释掉这两项配置?

因为这个版本的源代码在我本地构建过程中执行这两个任务时会导致构建失败,这两个任务主要是用来生成文档使用,对主流程并没有任何影响,可以直接忽略,当然如果大家本地没有这个问题,也可以不注释。


4.替换docs.gradle文件中的task schemaZip配置

在gradle的构建脚本,只针对Linux系统做了适配,需要把 task schemaZip替换成下面代码,因为原有代码的路径符号 “/”是针对Linux的,windows使用会有问题,在windows环境需要替换成 "\",参考如下代码,注释部分是原有的代码:

 
   
   
 
  1. //task schemaZip(type: Zip) {

  2. //    group = "Distribution"

  3. //    baseName = "spring-framework"

  4. //    classifier = "schema"

  5. //    description = "Builds -${classifier} archive containing all " +

  6. //            "XSDs for deployment at http://springframework.org/schema."

  7. //    duplicatesStrategy 'exclude'

  8. //    moduleProjects.each { subproject ->

  9. //        def Properties schemas = new Properties();

  10. //

  11. //        subproject.sourceSets.main.resources.find {

  12. //            it.path.endsWith("META-INF/spring.schemas")

  13. //        }?.withInputStream { schemas.load(it) }

  14. //

  15. //        for (def key : schemas.keySet()) {

  16. //            def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')

  17. //            assert shortName != key

  18. //            File xsdFile = subproject.sourceSets.main.resources.find {

  19. //                it.path.endsWith(schemas.get(key))

  20. //            }

  21. //            assert xsdFile != null

  22. //            into (shortName) {

  23. //                from xsdFile.path

  24. //            }

  25. //        }

  26. //    }

  27. //}

  28. task schemaZip(type: Zip) {

  29.    group = "Distribution"

  30.    baseName = "spring-framework"

  31.    classifier = "schema"

  32.    description = "Builds -${classifier} archive containing all " +

  33.            "XSDs for deployment at http://springframework.org/schema."

  34.    duplicatesStrategy 'exclude'

  35.    moduleProjects.each { subproject ->

  36.        def Properties schemas = new Properties();

  37.        subproject.sourceSets.main.resources.find {

  38.            it.path.endsWith("META-INF\spring.schemas")

  39.        }?.withInputStream { schemas.load(it) }

  40.        for (def key : schemas.keySet()) {

  41.            def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')

  42.            assert shortName != key

  43.            File xsdFile = subproject.sourceSets.main.resources.find {

  44.                it.path.endsWith(schemas.get(key).replaceAll('\/','\\'))

  45.            }

  46.            assert xsdFile != null

  47.            into (shortName) {

  48.                from xsdFile.path

  49.            }

  50.        }

  51.    }

  52. }


5.根据import-into-idea.md文档步骤去构建

根据import-into-idea.md文档里面介绍,我们需要对spring-core和spring-oxm做预编译,可以通过以下命令 ./gradlew:spring-oxm:compileTestJava,在IDEA比较简单,对这两个包分别按下图操作即可:

Spring5.x源码分析 | 从踩坑到放弃之环境搭建


6.终极构建Spring项目

最后一步,对整个Spring项目构建,这个时候它会自动下载依赖包,如果有异常,会在控制台抛出并停止操作。

Spring5.x源码分析 | 从踩坑到放弃之环境搭建

构建成功在控制台可以看到下图提示



第四、执行单元测试

即使整个项目没有error或者红点,也不代表项目已经成功构建好了,我们还需要执行个单元测试试下,如果能顺利执行单元测试,那证明该项目已经构建成功,这里我用到的是 DispatcherServletTests这个类,直接运行查看结果:

明显,上面单元测试类的所有单测执行成功,证明该项目已经构建完毕,可以开始开启Spring源码分析旅程啦!!!


第五、可能遇到的坑点回顾

  • 构建成功没报错,但执行单测有异常 ,类找不到——尝试点击右边菜单栏projects刷新项目或针对找不到类的模块重新build一次

  • 构建失败,缺少依赖包——尝试针对当前模块执行 buildDependents

  • 构建失败,执行gradle task失败——可能是当前运行环境版本不支持问题,如果不重要的问题,可以注释掉,保证构建正常

  • 构建失败,编码异常——可以通过idea工具设置:Editor-File encodings 全部设置为UTF-8


以上是关于Spring5.x源码分析 | 从踩坑到放弃之环境搭建的主要内容,如果未能解决你的问题,请参考以下文章

从入坑到不放弃-----centos7系统软件安装方法及网站环境搭建

AngularJs项目

你有一份来自春天的信—Spring5.x 源码分析 : 从容器启动开始

Feign踩坑源码分析 -- 请求参数分号变逗号

微服务发现与注册之Eureka源码分析

Spring源码 之环境搭建