目录
1、前言
自从spring5使用gradle构建之后,对于大部分maven党来说,搭建源码环境简直就是噩梦。网上的教程也有着各种各样的坑,因此在这里特意花时间整理了一下自己基于IDEA构建spring5源码环境,让广大群众能够不踩坑。
2、作案工具
构建源码环境之前先说明一下工具版本,尽量保持一致能够避免踩坑:
- gradle 4.9
- jdk1.8
- IDEA 2020.1
- spring 5.0.x
什么?你问我gradle怎么安装?自己去百度
3、源码下载
gayhub上面官方提供的源码下载实在有够慢,如果你会科学上网当我没说,要不然还是老老实实去码云上面体验极速下载:
https://gitee.com/mirrors/Spring-Framework
直接通过ssh clone下来后,我们接下来就可以通过IDEA来构建我们的源码环境了。
4、构建环境
使用IDEA打开Spring-Framework,首先第一件事就是把它自动构建的框框给取消了,因为我们还要改蛮多配置,现在不需要它帮我们构建。
![](https://i-blog.csdnimg.cn/blog_migrate/922002046ea9bf0ee929677980a0c774.png)
点了取消之后会提示我们取消构建:
![](https://i-blog.csdnimg.cn/blog_migrate/6ec575b9b5aca890d70f4c5e0ba45df4.png)
4.1 切换分支
取消构建之后,很重要的一件事情是,记得切换分支!!
在IDEA右下角切换成5.0.x版本。(什么?你说你不知道怎么切换?出门左转,百度一下)
![](https://i-blog.csdnimg.cn/blog_migrate/c3ae16d1da8ea55799e4fcd6b504449f.png)
4.2 修改配置
接下来就是做一些我们自己的配置。
首先要把的gradle目录->wrapper目录下的gradle-wrapper.properties文件里,distributionUrl配置改成我们本地的,这样就不会每次打开都脑瘫的去下载官方指定的版本。
distributionUrl=file:///F:/mydownload/gradle-4.9-bin.zip
然后我们在根目录的build.gradle文件里(相当于maven的pom文件)找到150行左右的位置,将原来的repositories修改成如下配置:
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" }
}
此外,spring-beans模块下的spring-beans.gradle里,记得要将该行代码注释掉,否则会报No such property: values for class: org.gradle.api.internal.tasks.DefaultTaskDependencies错误
compileGroovy.dependsOn = compileGroovy.taskDependencies.values - "compileJava"
4.3 开始构建
完成上述工作之后,点击右上角刷新gradle的图标,开始重新构建,这时候会给你下载一大堆东西,慢慢等着就好了,如果超时了再重试就行:
![](https://i-blog.csdnimg.cn/blog_migrate/322a700de7f8298b871e56ef99789fed.png)
等构建完成后,我们点开org.springframework.context.ApplicationContext类,按下Ctrl+Alt+U键,如果出现下图所示类图界面说明构建成功,构建过程就是找依赖对象的过程。
![](https://i-blog.csdnimg.cn/blog_migrate/17ababa2e5800d708bf0970171f2d17d.png)
5、源码编译
源码构建已经完成,但是我们需要在源码的基础上面进行修改,开发,调试,添加注释等等操作,所以需要将源码进行编译打包,下面就是将源码编译的过程。
5.1 spring-oxm模块编译
根据文档要求先编译spring-oxm下的compileTestjava,点击右上角gradle打开编译视图,找到springoxm模块,然后在Task -> other下找到compileTestjava。
双击之后稍等一会儿你会发现报错了:
Circular dependency between the following tasks:
:spring-beans:compileGroovy
\--- :spring-beans:compileJava
\--- :spring-beans:compileKotlin
\--- :spring-beans:compileGroovy (*)
这时候我们需要再次修改一下spring-beans模块下的spring-beans.gradle文件,没错,就是我们之前注释掉一行的文件,把最后三行(包括你之前注释掉的那一行)替换成如下:
def deps = compileGroovy.taskDependencies.immutableValues + compileGroovy.taskDependencies.mutableValues
compileGroovy.dependsOn = deps - "compileJava"
compileKotlin.dependsOn(compileGroovy)
compileKotlin.classpath += files(compileGroovy.destinationDir)
再次双击,编译完成。
5.2 spring-core模块编译
因为之后的spring-context依赖于core,我们需要把spring-core也编译一下,这次编译就容易多了,没有那么多的坑,直接双击完成。
5.3 编译整个工程
完成上述两个步骤之后,我们接着开始编译整个工程。
![](https://i-blog.csdnimg.cn/blog_migrate/9f0dad7c918d5436eac8652779d315d0.png)
双击build之后,默默等待IDEA帮你编译完就好了。过程有点漫长,慢慢等待吧。公司电脑跑了40分钟后,终于跑完了。。。
![](https://i-blog.csdnimg.cn/blog_migrate/cd88d8ccd5e966afb108540e961282d6.png)
至此源码是编译完成了,那么接下来,我们要加一个自己的模块用来测试一下,花了这么久时间构建的源码能不能用。
6、源码测试
首先我们新增一个自己的模块,名字自己随意起。注意,这里New -> Module选择的是gradle,可不要反手就选择了maven。
![](https://i-blog.csdnimg.cn/blog_migrate/707919b96ff5e5933bfad1b5a5306130.png)
finish之后,IDEA会自动帮我们构建自己的模块,然后打开全局配置文件:settings.gradle文件,在最下面我们可以看到自己添加的模块:
![](https://i-blog.csdnimg.cn/blog_migrate/3af8c0b340683248a7d80ade18dd1ede.png)
然后我们在自己的默认模块打开build.gradle文件,默认dependencies依赖(这里的dependencies和maven里的依赖是一样的)只有一个junit,我们需要手工添加spring-context这个核心模块。
dependencies {
//添加完要构建一下,否则代码中无法引用
compile(project(":spring-context"))
testCompile group: 'junit', name: 'junit', version: '4.12'
// lombok依赖
annotationProcessor 'org.projectlombok:lombok:1.18.2'
compileOnly 'org.projectlombok:lombok:1.18.2'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.2'
testCompileOnly 'org.projectlombok:lombok:1.18.2'
}
添加完之后刷新一下,接下来我们就可以在自己的模块下编写代码来测试一下能不能用了。
6.1 功能测试
接下来我们在自己创建的模块上面添加一些代码:
![](https://i-blog.csdnimg.cn/blog_migrate/0796dc3ffa60312b7884b11b7e167436.png)
这里我们使用注解的形式简单测试,代码如下:
BeanConfig.class:
@Configuration
@ComponentScan
public class BeanConfig {
@Bean
public User user(){
return new User(1,"hello,spring");
}
}
User.class
@Data
@ToString
@AllArgsConstructor
public class User {
private Integer id;
private String username;
}
Main.class
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());
}
}
6.2 BUILD FAILED
点击运行,然后你会发现,控制台并没有按你想象中的见证奇迹,而是给你报了个BUILD FAILED。
有问题我们就得看日志,控制台往上面翻,你会发现报错如下:
![](https://i-blog.csdnimg.cn/blog_migrate/5fa30eda888350b1204480ded08f43ca.png)
很明显,这是在编译的时候发现了警告,但是在某个地方指定了 -Werror参数,将警告当成了错误来处理。打开build.gradle文件,在106行找到我们的罪魁祸首,把这个参数删掉后再次运行:
![](https://i-blog.csdnimg.cn/blog_migrate/83af17eb973ee2507ca84ddcda15e33d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/52092faef27e39a45529cde5c33a066d.png)
7、结尾
至此我们的spring5.0.x源码环境已经构建完成,我们可以在这上面进行修改、添加注释并且上传到自己的仓库上,接下来,我们就可以开始我们对spring5的源码探索了!