Spring5源码阅读环境搭建-gradle构建编译
前沿:Spring系列生态十分丰富,涉及到各个方面。但是作为Spring生态的核心基础Spring,是最重要的环节,需要理解Spring的设计原理,我们需要解读源码。
在构建Spring源码阅读环境时,遇到一些问题。通过多次尝试,慢慢找到了正确的构建编译方式,下面就记录下 Spring源码阅读环境的构建编译完整过程 。【在网上也找到过许多类似的文章,但发现都不是很完整,而且讲述得也不是很清晰】
最后提供构建好的源码下载,可以直接使用!!!!!
1.搭建构建前环境
JDK
安装JDK就不用介绍了,保证是jdk1.8以上的版本就行了。

Gradle
直接在官网下载gradle>构建工具,解压到本地后配置环境变量。增加系统变量GRADLE_HOME=gradle的路径,增加path= %GRADLE_HOME%\bin

idea工具
使用IntelliJ IDEA 2018.3.2开发工具,下载安装激活教程。idea安装教程
2.下载源码
直接去github下载源码,选择5.x版本
https://github.com/spring-projects/spring-framework
https://repo.spring.io/libs-release-local/org/springframework/spring/

将下载的源码解压到本地就行,下一步就是开始构建源码了。

3.开始构建
在cmd中进入源码目录,输入gradlew.bat命令

使用工具编译时,可能会出现内存溢出情况,这里我们编译时需要增加相关参数
xml -XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m


使用国内的地址能明显提高依赖的下载速度
maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}

发现构建gradle不通过

解决方法:关于这个问题我在网上找了很多资料,最后发现多更新几次就没问题了,主要是需要下载很多依赖包,但可能由于网速的问题导致失败。总之fail了你就多refresh几次,这个过程需要一定时间的。

等待一定时间后,构建成功!【并没有网上说的那么难,以前的版本可能需要配置很多文件。现在的版本构建很简单,需要失败可能是由下载依赖包失败导致的】


在IDEA中,如果能找到ApplicationContext类,按下Ctrl+Shift+Alt+U键,出现下图所示类图界面说明构建成功了!
此时可以查看Spring的源码了,但是我们需要在源码的基础上面进行修改,开发,最好将源码进行编译打包,下面就是将源码编译的过程。

4.编译源码
在构建完成源码之后,就搭建好了阅读源码的环境了。但是我们还可以将源码编译打包。在编译之前需要进行一些配置修改,可以查看import-into-idea.md文档

在编译之前还需要对dosc.gradle文档进行修改,因为有些注释,文件路径在编译时需要调整。



下面将两个地方的路劲替换使用windows环境下的反斜扛 \
- 下面给出task schemaZip中修改的部分
- it.path.endsWith(“META-INF\spring.schemas”)
- it.path.endsWith(schemas.get(key).replaceAll(’\\/’,’\\\\’))

也可以用下面的方法判断是在什么环境中编译,直接粘贴复制。
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
}
}
}
}
接下来先编译1. Precompile spring-oxm with ./gradlew :spring-oxm:compileTestJava


在Precompile spring-oxm with ./gradlew :spring-oxm:compileTestJava编译完成后,可以编译整个工程了!(这个过程非常耗时间,可能20几分钟!)

进过一段时间编译build成功!(每个人电脑的性能不一样,所需时间也不一样。 )

发现spring-aspects模块有错误, 选中该模块,右键–Load/Unload Modules ,把spring-aspects下的所有项目排除出去。


到这里,整个Spring源码的编译和环境准备就完成了,接下来我们编写一个demo来调试一下,看看我们的代码是否没问题。

4.测试
完成了上面的过程后,我们可以自己编写一个模块测试该源码构建编译过程是否完成!
- 在Spring中添加自己的module模块,同样选择gradle构建。

- 输入ArtufactId,工程名

- 选择默认的存储路径即可

- 确认,idea会自动帮助我们构建spring-mytest模块。



- 下面编写一个简单的applicationContext获取容器用的bean,主要是测试Spring源码构建编译过程是否成功!

新建User.java
package com.gqz.springtest;
/**
* @ClassName: User
* @author: ganquanzhong
* @date: 2019/9/2 11:27
*/
public class User {
private int uid;
private String username;
private String pwd;
private String tel;
private String addr;
public User(int uid, String username, String pwd, String tel, String addr) {
this.uid = uid;
this.username = username;
this.pwd = pwd;
this.tel = tel;
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", pwd='" + pwd + '\'' +
", tel='" + tel + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
新建JavaConfig.java (使用注解的方式声明bean)
package com.gqz.springtest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName: JavaConfig
* @author: ganquanzhong
* @date: 2019/9/2 11:43
*/
@Configuration
@ComponentScan
public class JavaConfig {
@Bean
public User user(){
return new User(101,"ganquanzhong","pwd","13995978321","china");
}
}
最后写一个测试类Main.java
package com.gqz.springtest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @ClassName: Main
* @author: ganquanzhong
* @date: 2019/9/2 12:29
*/
public class Main {
public static void main(String[] args){
ApplicationContext ac =new AnnotationConfigApplicationContext(JavaConfig.class);
User user = (User) ac.getBean("user");
System.out.println(user.toString());
}
}
- 运行
consoloe输出
User{uid=101, username='ganquanzhong', pwd='pwd', tel='13995978321', addr='china'}

4.遇到的问题解决方法
这个总结下构建源码阅读环境过程中会遇到的问题和解决办法。
- 在idea中导入spring5源码构建时,spring-core模块报错,缺失cglib相关的jar包依赖。
为了避免第三方class的冲突,Spring把最新的cglib和obj巳nesis给重新打包(repack)了,它并没有在源码里提供这部分的代码,而是直接将其放在jar包当中,这也就导致了我们拉取代码后出现编译错误。那么为了画过编译,我们要把缺失的jar补回来
- Aspecu编译问题解决,主要是aspect关键字Java语法违背,需要使用ajc编译器执行。下面就切换ajc编译器,首先需要下载aspectj,并且安装。
- 为spring-aspect工程添加Facets属性

- 编译器要改为Ajc,同时要设置Ajc的安装目录,如图1-27所示。记住,要选择到a spec飞jtools.jar这个层面,同时,务必要边择Delegateto Javac选顷,它的作用是只编译AspectJ的Facets项目,而其他则使用JDK代理。如果不勾选,则全部使用Ajc编译,那么会导致编译错误。

在idea中导入spring5源码构建时,spring-oxm模块报错,在gradle中找到spring-oxm的genCastor、genJaxb 命令。

经过上面的jar修复操作后,在依赖library中应该有以下几个模块!!!!
build finish


源码下载
附上我构建好的源码,并且会一直更新源码的分析过程,感兴趣的可以start下
在README有详细的步骤,请查看!!!!!!
Spring5源码阅读环境搭建-gradle构建编译的更多相关文章
- 基于Eclipse IDE的Ardupilot飞控源码阅读环境搭建
基于Eclipse IDE的Ardupilot飞控源码阅读环境搭建 作者:Awesome 日期:2017-10-21 需准备的软件工具 Ardupilot飞控源码 PX4 toolchain JAVA ...
- Spring源码阅读环境搭建
目录 安装gradle 导入Spring源码 创建测试模块my-test 其他问题 spring-aspects模块构建时报错 本文思维导图 本文将粗略的搭建一个Spring源码的阅读环境,为后面的源 ...
- Hadoop源码阅读环境搭建(IDEA)
拿到一份Hadoop源码之后,经常关注的两件事情就是 1.怎么阅读?涉及IDEA和Eclipse工程搭建.IDEA搭建,选择源码,逐步导入即可:Eclipse可以选择后台生成工程,也可以选择IDE导入 ...
- react v16.12 源码阅读环境搭建
搭建后的代码(Keep updated): https://github.com/lirongfei123/read-react 欢迎将源码阅读遇到的问题提到issue 环境搭建思路: 搭建一个web ...
- spring-framework-4.1.x源码阅读环境搭建(导入Eclipse)
注意:搭建spring-framework-4.1.x源码 eclipse工作空间需要安装jdk8. spring-framework-4.1.x项目采用目前主流的项目管理工具gradle进行构建,至 ...
- Sping学习笔记(一)----Spring源码阅读环境的搭建
idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...
- 搭建 Spring 源码阅读环境
前言 有一个Spring源码阅读环境是学习Spring的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...
- win7+idea+maven搭建spark源码阅读环境
1.参考. 利用IDEA工具编译Spark源码(1.60~2.20) https://blog.csdn.net/He11o_Liu/article/details/78739699 Maven编译打 ...
- 【Java】用IDEA搭建源码阅读环境
用IDEA搭建源码阅读环境 参考自CodeSheep的Mac源码环境搭建, https://www.bilibili.com/video/BV1V7411U78L 但是实际上在Windows搭建的差别 ...
随机推荐
- 错误:EfficientDet网络出现"No boxes to NMS"并且mAP:0.0的解决方案
近日,在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候,出现了如下错误: 其中项目开源地址是:https://github.com/toandaominh1997 ...
- SqlServer视图查询效率测试
一. 测试背景开发一个项目,数据库用的是sqlserver.帐号表数据有一两百万,不算大,也不算小.在考虑是否要使用视图,担心效率,百度了下资料,众说纷纭,好吧,实践是最好的证明,那么我们就来测试吧 ...
- 【python基础语法】模块和包管理,文件的操作(第8天课堂笔记)
''' 模块和包管理 模块和包的定义: 模块:模块是一个Python文件,以.py结尾,包含了Python对象定义和Python语句 包:Python中的包就是一个包含__init__.py文件的目录 ...
- Jean-Pierre Serre访问录
问:是什么使您以数学为职业的? 答:我记得大概是从七.八岁时起喜欢数学的.在中学里, 我常做一些高年级的题目.那时,我寄宿于Nimes,与比我大的孩子住在一起,他们常常欺侮我,为了平抚他们,我就经常帮 ...
- Java多线程之线程的协作
等待队列 每个实例都有一个等待,他是在实例的wait方法执行后停止操作的队列,除非发现以下情况,线程才会退出等待队列 1.有其他线程的notify方法来唤醒线程 2.有其他线程的notifyAll方法 ...
- R语言入门:使用RStudio的基本操作
R语言在人工智能,统计学,机器学习,量化投资,以及生物信息学方面有着十分广泛的运用.也是我大学的必修课,因此这里梳理一些有关R语言的知识点,做做记录. 首先我们需要知道R语言的工作区域,R语言默认的工 ...
- nginx 反向代理及 https 证书配置
nginx 反向代理及 https 证书配置 author: yunqimg(ccxtcxx0) 1. 编译安装nginx 从官网下载 nginx源码, 并编译安装. ./configure --pr ...
- UI设计的定义和view、viewgroup及其一些常用属性
1.uI设计 UI设计就是用户界面设计,比如QQ登录界面.聊天界面等,进行UI设计将会用到View和Viewgroup. 2.view 在安卓中可以理解为视图,在安卓中占用一块矩形区域,负责提供主件绘 ...
- 论文阅读笔记(十五)【CVPR2016】:Top-push Video-based Person Re-identification
Approach 特征由两部分组成:space-time特征和外貌特征.space-time特征由HOG3D[传送门]提取,其包含了空间梯度和时间动态信息:外貌特征采用颜色直方图[传送门]和LBP[传 ...
- 轻量级RPC设计与实现第四版
在本版本中引入了SPI机制,关于Java的SPI机制与Dubbo的SPI机制在以前的文章中介绍过. 传送门:Dubbo的SPI机制与JDK机制的不同及原理分析 因为设计的RPC框架是基于Spring的 ...
