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


前言

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


Spring5.x整体架构回顾

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

  • JDK版本:1.8.0_161

    • 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  • GRADLE版本:4.9
    • 下载地址:https://gradle.org/releases/
    • 配置教程:https://www.cnblogs.com/linkstar/p/7899191.html
  • Spring源码版本:v5.0.8.RELEASE
    • 下载地址:https://github.com/spring-projects/spring-framework/releases
  • IntelliJ IDEA版本:IntelliJ IDEA 2018.2.1 (Ultimate Edition)
    • 下载地址:https://www.jetbrains.com/idea/download/
  • 系统:WINDOWS 10

第二、下载源码

下载源码可以直接到Spring源码仓库 下载v5.0.8.RELEASE版本的zip包在本地解压,也可以通过fork方式把它fork到自己仓库,方便后续更新维护。

我已经配置好了,如果不想麻烦的同学可以直接到我的github拉取Spring源码https://github.com/Evan43789596/eshare-spring-framework,记得切换到 ftr_spring_learning分支

下载到本地解压如下:



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

  • build.gradle 放了一些依赖配置,有点像maven的pom文件
  • gradle.properties 存放当前Spring的版本,可以对比下看看是不是5.0.8版本
  • gradlew.bat 放的是项目的构建脚本,不过在本章用不上,本章是使用IDEA去构建
  • import-into-idea.md 这个是Spring导入IDEA的说明文件,可以根据里面的步骤去导入

第三、导入IDEA

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



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


2.修改docs.gradle文件

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

打开docs.gradle文件


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

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

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


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

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

* What went wrong:
Failed to capture snapshot of input files for task ':distZip' property 'rootSpec$1$3' during up-to-date check.
> Failed to create MD5 hash for file 'D:\repository\spring-framework-5.0.8.RELEASE\build\distributions\spring-framework-5.0.8.RELEASE-schema.zip'. * Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 1m 43s
254 actionable tasks: 3 executed, 251 up-to-date

参考如下代码,注释部分是原有的代码:

//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'
// moduleProjects.each { subproject ->
// def Properties schemas = new Properties();
//
// subproject.sourceSets.main.resources.find {
// it.path.endsWith("META-INF/spring.schemas")
// }?.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 {
// it.path.endsWith(schemas.get(key))
// }
// assert xsdFile != null
// into (shortName) {
// from xsdFile.path
// }
// }
// }
//}
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'
moduleProjects.each { subproject ->
def Properties schemas = new Properties(); subproject.sourceSets.main.resources.find {
it.path.endsWith("META-INF\\spring.schemas")
}?.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 {
it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\'))
}
assert xsdFile != null
into (shortName) {
from xsdFile.path
}
}
}
}

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

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


6.终极构建Spring项目

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

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


第四、执行单元测试

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



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


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

  • 构建成功没报错,但运行单元测试有异常 ,提示类找不到

    • **方案1:**尝试点击右边菜单栏projects刷新项目,然后对Spring(Root)模块先clean再build一次
    • **方案2:**针对找不到类的模块重新build一次
    • **方案3:**点击Spring(root)模块下的Tasks->other->compileTestJava 执行一遍,针对test类编译一次即可
  • 构建失败,缺少依赖包
    • **方案1:**对Spring(Root)模块先clean再build一次(建议打开VPN,有可能存在某些包下载不成功导致)
    • **方案2:**尝试针对当前模块执行buildDependents
  • 构建失败,执行gradle task失败
    • **方案1:**可能是当前运行环境版本不支持问题,如果不重要的问题,可以注释掉,保证构建正常
  • 构建失败,编码异常
    • **方案1:**可以通过idea工具设置:Editor-File encodings 全部设置为UTF-8

可以参考我另一篇文章:

https://blog.csdn.net/Evan_Leung/article/details/95903083

Spring5.x源码分析 | 从踩坑到放弃之环境搭建的更多相关文章

  1. Spring5深度源码分析(三)之AnnotationConfigApplicationContext启动原理分析

    代码地址:https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian AnnotationCon ...

  2. 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01

    百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...

  3. 踩坑记:Tensorflow环境搭建

    自从上一篇论文投出去,之后就各种事就来了……处理那些乱七八糟的事就是让人心累,在加上师哥们毕业,能帮我的人越来越少了,而要指望你的人呢,越来越多.一想到那些用搜索引擎都搜不到资料的人,蓦地想起邓爷爷说 ...

  4. spring源码深度解析—Spring的整体架构和环境搭建

    概述 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框 ...

  5. openswan源码ubantu下编译、安装、基本环境搭建

    openswan的编译过程 文章目录 openswan的编译过程 1. 下载源码: 2. 在虚拟机上解压后编译: 2.1 查看INSTALL文件 2.2 查看文件buildlin.sh文件 3. 查看 ...

  6. Apache Spark源码走读之12 -- Hive on Spark运行环境搭建

    欢迎转载,转载请注明出处,徽沪一郎. 楔子 Hive是基于Hadoop的开源数据仓库工具,提供了类似于SQL的HiveQL语言,使得上层的数据分析人员不用知道太多MapReduce的知识就能对存储于H ...

  7. [源码分析] 消息队列 Kombu 之 Producer

    [源码分析] 消息队列 Kombu 之 Producer 目录 [源码分析] 消息队列 Kombu 之 Producer 0x00 摘要 0x01 示例代码 0x02 来由 0x03 建立 3.1 定 ...

  8. 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...

  9. 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...

随机推荐

  1. 使用element的upload组件实现一个完整的文件上传功能(上)

    说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...

  2. 解决Jsp与Java后台之间url传值中文乱码问题

    JSP页面中,由JavaScript拼接url时,对于中文名称变量应该加上encodeURIComponent方法,对中文进行十六进制编码. 例如: url = /com/xxx/B.jsp?chin ...

  3. Qt5 http/HTTPS访问 以及JSON解析的实用

    实用QT5访问HTTP/以及HTTPS协议访问 并且调用Json解析 #include "mywidget.h" #include "ui_mywidget.h" ...

  4. $loj6043$ [雅礼集训 $2017\ Day7$] 蛐蛐国的修墙方案 搜索

    正解:搜索 解题报告: 传送门$QwQ$ 首先由$p_i$是一个序列得,每个点的度数为2.且一定形成若干个环. 考虑先对每个环做,发现若要有解必须是偶环,且一定是隔一条边选一条边的,所以对每个环其实只 ...

  5. 洛谷$P2153\ [SDOI2009]$ 晨跑 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 题目好长昂,,,大概概括下$QwQ$.就说有$n$个节点$m$条边,然后要求每次走的路径都不一样,问最多能走多少次,然后在次数最多的前提下问路径最短是多少$ ...

  6. [UWP]XAML中的响应式布局技术

    响应式布局的概念是一个页面适配多个终端及不同分辨率.在针对特定屏幕宽度优化应用 UI 时,我们将此称为创建响应式设计.WPF设计之初响应式设计的概念并不流行,那时候大部分网页设计师都按着宽度960像素 ...

  7. Java实现上传文件到指定服务器指定目录

    前言需求 使用freemarker生成的静态文件,统一存储在某个服务器上.本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch.毕竟有现成的就很舒服,在此介绍给大家. 具体实现 引入的pom ...

  8. wrk性能测试(详解)

    一.简介 wrk 是一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产 ...

  9. 一次 kafka 消息堆积问题排查

    收到某业务组的小伙伴发来的反馈,具体问题如下: 项目中某 kafka 消息组消费特别慢,有时候在 kafka-manager 控制台看到有些消费者已被踢出消费组. 从服务端日志看到如下信息: 该消费组 ...

  10. 在浏览器窗口内移动的div

    ------------今天研究了一个最简单的屏保效果----------- 效果图如下:效果很神奇,就是这个div在浏览器窗口不断的灵活移动 代码却很简单 <!DOCTYPE html> ...