Spring 源码环境搭建
一. 背景
今天从公司图书角借到一本书, 名字叫 <<Spring源码深度解析>>, 抱着试着看的态度学习了下, 结果发现在使用idea搭建Spring源码环境时会出现很多问题, 而我的性格有时候又比执着. 所以还是花了将近一天时间把环境搭建好了. 现在将搭建过程重新梳理下, 希望能够帮助到其他人
二. 开发环境
- jdk: 1.8.0_231
- gradle 4.9
- IDEA 2021.1.2
- spring 5.0.x
- 关于jdk, gradle, idea 可自行下载
- gradle 是一种类似maven的编译构建工具, 如果不会使用, 可以跳转至 这里 学习一下. 但建议版本最好一致. 否则可能会出错.
- 关于Spring源码下载安装, 下面会着重介绍
三. 源码下载与构建
下载
- 选择对应版本, 点击 这里 进行下载. 也可以直接在右上角code按钮, 复制下载地址, 执行下一步操作
- 通过idea导入, 复制第1步的下载地址导入
随便在一个页面, 双击 ctrl上面的
shift
, 然后输入get from
,选择第一个
- 输入第1步的git地址, 下载Spring源码
- 下载完毕后, 确认是否是5.0.x版本, 如果不是请切到这一版本 不知道为什么, 在第一步选择好版本之后下载的代码还是main分支上的, 所以这一步很重要
下载完毕后, 先不要急着构建, 需要我们先进行配置, 心急吃不了热豆腐~~~
配置
进入gradle->wrapper->gradle-wrapper.properties
文件,将gradle改成本地distributionUrl=file:///E:/Download/maven_rep/gradle-4.9-bin.zip
注意路径不要有空格, 否则会报错
在根目录的build.gradle文件里(相当于maven的pom文件)找到150行左右的位置,将原来的repositories修改成如下配置:
代码语言:javascript复制 repositories {
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
maven { url "https://repo.spring.io/milestone" }
maven { url "https://repo.spring.io/plugins-release" }
}
继续修改 build.gradle 文件, 将 100行左右的-Werror
参数去除
如果不去除, 会在后面编译的时候发现警告后,将警告当成了错误来处理, 影响程序正常运行
在spring-beans模块下的spring-beans.gradle里,注释下面代码, 否则会报No such property: values for class: org.gradle.api.internal.tasks.DefaultTaskDependencies错误
构建
完成上述工作之后,点击右上角刷新gradle的图标,开始重新构建(时间用时较长20min )
点开org.springframework.context.ApplicationContext类,按下Ctrl Alt U
键,如果出现下图所示类图界面说明构建成功,构建过程就是找依赖对象的过程
编译
首先编译spring-oxm模块
点击右上角gradle打开编译视图,找到springoxm模块,然后在Task -> other下双击compileTestjava
编译之后会报错, 大致内容如下
代码语言:javascript复制Circular dependency between the following tasks:
:spring-beans:compileGroovy
--- :spring-beans:compileJava
--- :spring-beans:compileKotlin
--- :spring-beans:compileGroovy (*)
这里我们需要再次修改一下spring-beans模块下的spring-beans.gradle文件(覆盖掉配置第4步注释的内容)
代码语言:javascript复制def deps = compileGroovy.taskDependencies.immutableValues compileGroovy.taskDependencies.mutableValues
compileGroovy.dependsOn = deps - "compileJava"
compileKotlin.dependsOn(compileGroovy)
compileKotlin.classpath = files(compileGroovy.destinationDir)
再次进行编译 compileTestjava
然后编译 spring-core模块, 按照步骤1 即可, 无需步骤2
编译整个项
四. 源码测试
新建gradle模块, 用于编写测试代码
新模块结构如下, 下面贴出相关代码
代码语言:javascript复制@Data
@ToString
@AllArgsConstructor
public class User {
private Integer id;
private String username;
}
----------------------------------------
@Configuration
@ComponentScan
public class BeanConfig {
@Bean
public User user(){
return new User(1,"hello,spring");
}
}
----------------------------------------
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(BeanConfig.class);
User user = (User)context.getBean("user");
System.out.println(user.toString());
}
}
运行main方法, 控制台输出如下
控制台乱码问题的解决
从上图可以看到, 控制台显示的中文信息全部以乱码的形式出现, 这是因为
- 项目中gradle.properties文件中添加设置
org.gradle.jvmargs=-Dfile.encoding=UTF-8
- idea中在 Help -> Edit custom VM options添加设置
-Dfile.encoding=UTF-8
- 重启idea
附: 成功之后的控制台输出中文截图
参考博客 https://blog.csdn.net/qq_22172133/article/details/81513955 https://blog.csdn.net/foxException/article/details/108334235