编译Spring5.0.x源码之一路坎坷,你经历过绝望吗?
本文来说说在编译spring-springframework-5.0.x的路上,小编我到底经历了什么?
如果正在看文章你,恰好也想要研究spring源码,那么请先做好准备再动手,不然迎来的问题如滔滔江水,连绵不绝。
第一天:
先来说说环境:系统:MacOs、开发工具:idea 2017、JDK:1.8
spring源码传送门:https://github.com/spring-projects/spring-framework
第一天小编什么都没准备,直闯源码仓库,找到5.0.x版本,
小编为了方便,直接使用idea工具,checkout源代码(这里是IDEA 2019 版本的截图)
经过一阵子的等待,源码下载好了,就很开心,很顺利进入iead。
进入之后idea就在进行编译准备环境,因为spring5.0.x使用了gradle,所以idea自动帮我在下载,以及对应的项目依赖。
这个过程很久很久,加上网速慢,滴滴滴,下班时间到了,下班回家~~~~~
第二天:
周六的上午,早起接着编译把,idea控制台就一直再刷刷刷,等啊等,然后就报错了
Cause: org/gradle/api/internal/plugins/DefaultConvention.......
然后就开始找问题,网上有博主说是gradle版本问题,然后就更换了gradle版本,重新编译。
又是很长一阵子的等待..........
又抛出另外一个错误(问题不好重现,忘记什么问题了),心累了,关机~~~
第三天:
小编开始吸取教训,先收集一下网络上相关经验,发现绝大都是使用IDEA2018版本以上的,小编就从官方上下载了2018版本的idea。
然后就开始下载,安装、**,一顿操作可以使用了。
现在的环境是:开发工具:idea 2018、JDK:1.8
然后又重新导入spring项目,开始编译中,很开心,这次终于正常编译好了。
如果能进入到这里,spring构建的就差不多了。
第四天:
这就真的好了吗?? 不不不,事情没有辣么简单~~
这一切都是外表,正当小编想要进一步深入了解的时候,控制台错误信息:
错误: 程序包jdk.jfr不存在 import jdk.jfr.Category;
进入源码中查看,源码确实引用了jdk.jfr包里面的内容,一百度,这个jdk1.8不行呀。
然后小编把jdk升级到jdk11了,又开始下载、安装、环境配置
这一下好了,从源码中查看这个包确实引入成功了,但是重新编译的时候,还是继续提示不存在。
WTF ????
从大佬那了解到,如果使用idea2017、2018构建spring源码可能出现问题会更多一点。
然后、然后、然后开始下载idea2019,开始安装,**(这个2019**还花了九牛二虎之力)。
第五天:
现在环境:开发工具:idea 2019、JDK:11
构建个spring源码idea都换了两个版本,心都累了。
经过之前几个问题的处理,小编修改过spring源码的gradle配置文件,也不知道是不是项目导入的方式有问题。
决定把之前的源码删了,直接用zip压缩包的形式下载,进行导入。
这一次编译什么的,都很顺利,然后我们需要进一步的来操作,来保证我们构建的spring源码能够正常运行。
第一步:
找到在idea右侧,选择Gradle,找到spring-core —— Tasks —— other —— complieTestJava
然后双击他,让它运行,为了保证spring真正的构建成功,看看有没有其他问题。
如果你是个幸运儿,就看到如下提示,万一出了问题,那么恭喜你,还得继续努力。
小编这一步没有遇到什么问题,勉强算通过了吧。
第二步:
编译下spring-context 的源码,刚构建好的spring项目,spring-context是没有编译的,展开这个项目,找到下面的test包,
如图选择所示,然后右键run让它跑一遍,这样就会进行编译,运行后会出来这个out文件夹,里面放在编译后的class文件。
如果你也很顺利的编译完成,那就可以进行写代码进行测试,如果不行把产生的out文件夹删了,重新运行一次,如果还不行,就分析具体问题具体解决把。
第三步:
新建一个模块,进行代码测试。
在跟目录上,右键选择new —— module
然后选择Gradle项目,下一步,填写相关信息,直接finish就OK了。
如果想要在自己新建的项目当中,引用其他项目,那么当然需要修改gradle的配置文件。
以刚刚编译的spring-context为例子,进行引入,等待gradle加载完成,就可以写代码测试了。
代码测试如下:
AppConfig.java
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan;
/**
* Created by IntelliJ IDEA.
*
* @author IT 贱男
* description:
* date: 2020/8/14 09:52
*/
@Configurable
@ComponentScan("org.springframework.display")
public class AppConfig {
}
User.java
import org.springframework.stereotype.Component;
/**
* Created by IntelliJ IDEA.
*
* @author IT 贱男
* description:
* date: 2020/8/14 09:34
*/
@Component
public class User {
public String name = "张山";
}
Test.java
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.display.config.AppConfig;
import org.springframework.display.model.User;
/**
* Created by IntelliJ IDEA.
*
* @author IT 贱男
* description:
* date: 2020/8/14 09:33
*/
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
User user = (User) context.getBean("user");
System.out.println(user.name);
}
}
从运行的结果得知,能够正确使用自己构建的spring项目,来完成一个ioc功能。
最后总结说明一下:
1、环境:推荐使用 IDEA 2019或者以上的版本、JDK 11。
其实在构建spring源码之前,还需要准备安装gradle,但是小编最开始不知道,选择了直接使用idea进行下载项目。目前使用来说还算正常,没遇到奇怪的问题。
2、当整个spring源码构建的差不多了,最好需要按照本文第五天的三个步骤,按顺序走一遍流程,确保能够正常使用。
在学习和写代码的日子里,总会遇到奇奇怪怪的问题,耐得住性子,解决就好哈哈哈哈。
不知道你们有没有小编这种类似的经历,可以留言分享一下哟~~~~
啊对了,18年小编写过Spring从入门到源码解析,经过2年时间的累积,今年也会陆陆续续更新源码的讲解,比如说一个bean的注入的执行流程,根据源码一步一步分析。
目录传送门:Spring从入门到源码解析——博客学习目录