记录一下自己编译Spring-framework-5.0.x的过程

  • ​​1. 准备阶段 (环境:jdk1.8+spring5+gradle4.9+eclipse4.11)​​
  • ​​1.1 jdk1.8​​
  • ​​1.2 Gradle安装与配置​​
  • ​​1.3 AspectJ和Groovy安装与配置​​
  • ​​1.4 spring-framework-5.0.x源码下载​​
  • ​​2. 开始编译​​
  • ​​2.1 运行import-into-eclipse.bat​​
  • ​​2.2 导入spring源码到eclipse或者STS​​
  • ​​3. 生成根目录​​
  • ​​4. 导入根项目到eclipse中​​
  • ​​补充:​​
  • ​​1. AJDT插件的安装​​


说明一下我这里打算用eclipse查看源码,所以下面的编译操作后,只是为了往eclipse里面导入,没有尝试往idea里面导入。

1. 准备阶段 (环境:jdk1.8+spring5+gradle4.9+eclipse4.11)

1.1 jdk1.8

由于此次编译的是spring-framework-5.0.x,jdk版本最低需要1.8

使用eclipse导入spring-framework-5.0.x源码_eclipse

1.2 Gradle安装与配置

1. gradle下载地址:https://services.gradle.org/distributions/

使用eclipse导入spring-framework-5.0.x源码_Spring源码_02


截止到目前,gradle最新版本为5.6.1了。gradle下载时候有三个包,gradle-src为gralde源码,gradle-bin为安装包,gradle-all为源码加安装包,我这里下载的是​​gradle-all​​​我刚开始直接下载的最新版本的,结果到后面编译的时候,报错了,提示有个什么东西​​1.8​​​,还是什么​​​​什么鬼的版本问题,然后我就换成4.10了,就没有报那个错误了。

gradle下载后不需要安装,解压在本地磁盘后配置环境变量即可。

2. 配置环境变量:

新建​​GRADLE_HOME​​​,path中增加​​%GRADLE_HOME%/bin;​​即可。

配置完成以后win+r,输入cmd进入dos界面,键入命令gradle -v,若如下图正确输出版本信息即可

使用eclipse导入spring-framework-5.0.x源码_Spring源码_03


这个查看版本的命令是不是跟maven很像??这俩其实功能差不多。

然后配置gradle默认的本地仓库,可做如下配置,新增​​GRADLE_USER_HOME​​​,路径配置成需要的本地仓库路径即可,我这里配置为:​​E:\Gradle\LocalRepository​​。

1.3 AspectJ和Groovy安装与配置

AspectJ的安装让我折腾了半天,由于我的eclipse是4.11版本的,​​https://www.eclipse.org/ajdt/downloads/​​​找了一下,最新的版本只有适合eclipse4.10版本的,上面提示说插件适合的版本需要和Eclipse的版本一致才可以生效,然后就试着装了一下,好像确实没有生效。当然如果没有安装的话,在最后导入项目的时候,会提示缺少这两个工具,直接在marketPlace里面可以看到Groovy,直接点​​Install​​​按钮即可,但是另外的​​AspectJ Development Tools​​​,这个玩意却没有​​Install​​​按钮可以点,只有一个​​learnMore​​,在折腾半天之后,那我就点learnMore看看吧,进去里面之后竟然有个Install,点了之后貌似就正常安装了。

1.4 spring-framework-5.0.x源码下载

这里我们直接从全球最大的同性交友平台github上下载就可以了,进入github官网,直接搜索​​spring-projects/spring-framework​​,第一个就是我们需要的。

使用eclipse导入spring-framework-5.0.x源码_spring_04


进去项目里面,选择我们需要的版本,我这里下载的是​​5.0.x​​,这里我直接下载的源码的压缩包。

使用eclipse导入spring-framework-5.0.x源码_Spring源码_05


然后解压到​​E:\Spring-Resource\spring-framework-5.0.x​

使用eclipse导入spring-framework-5.0.x源码_xml_06


由于我这里已经编译过了,所以根目录下会有.setting文件夹。

2. 开始编译

2.1 运行import-into-eclipse.bat

在尝试多次编译失败之后,偶然在百度上看到,说直接双击运行​​spring-framework-5.0.x​​​文件夹里面的​​import-into-eclipse.bat​​,我也只能死马当成活马医了,试一下吧,然后意外的是,没有报错!!!!!

弹出如下窗口,开始下载依赖包了,第一次运行了十几秒之后提示fail并且自动退出了,我又运行一次,就正常了。

使用eclipse导入spring-framework-5.0.x源码_spring_07


使用eclipse导入spring-framework-5.0.x源码_Spring源码_08

使用eclipse导入spring-framework-5.0.x源码_xml_09


过程是漫长的,耐心等待即可。 ​​出现编译成功的绿条之后,不要着急按任意键!​

编译结束之后 我看了一下gradle的本地仓库文件夹里面,多了将近一个G的新文件,也就是说spring编译的过程,也就是拼电脑配置和网速的时候了。编译的时间长短,取决于你的电脑的配置和网速。还有一点就是需要检查你的gradle的本地仓库的位置是不是自定义的,因为默认会在C盘比如我的是在​​C:\Users\linmengmeng\.gradle​​,到这里我才发现我之前没有配置本地仓库,写博客时就把本地仓库加在前面环境变量了。

可以看到cmd窗口里面提示到编译完成之后,下面开始第二步:

2.2 导入spring源码到eclipse或者STS

直接在eclipse的左侧项目空白处右键===>Import===>Existing Projects into Workspace,选择spring源码解压的根目录。

使用eclipse导入spring-framework-5.0.x源码_xml_10


使用eclipse导入spring-framework-5.0.x源码_xml_11


由于我当时没有安装groovy和ajnature,这里会有一个提醒安装的弹窗,这点还是很方便的。这里默认勾选了这两个插件,直接点Show Solutions。

使用eclipse导入spring-framework-5.0.x源码_eclipse_12


eclipse卡了一下之后,弹出下面的弹窗,但是只有Groovy的Install按钮,那就点击Install安装就完事了。

使用eclipse导入spring-framework-5.0.x源码_xml_13


使用eclipse导入spring-framework-5.0.x源码_spring_14


使用eclipse导入spring-framework-5.0.x源码_spring_15


然后提示是否重启eclipse,点击立即重启即可。重启之后就可以看到Project下出现了这么多新的项目

使用eclipse导入spring-framework-5.0.x源码_gradle_16


但是这个spring-beans上面有个叉,不用着急,让eclipse飞一会就好了,等右下角的progress绿条反应完就好了。如果还有问题,可以 看一下Problem里面的具体信息,我这里是提示groovy的编译版本跟工作空间的不一致,这个错误忘了截图了,记得就是提示一个是2.4,另一个是2.5,直接右键项目名,然后选择Properties,然后将groovy的编译的版本改成后面的那个就好了,根据实际情况,你的不一定也是2.5,我晚上回去在我自己电脑上编译的时候,这个报错信息就变成需要改为3.0了。

使用eclipse导入spring-framework-5.0.x源码_xml_17

我在我自己电脑上导入项目之后,spring-jdbc项目上面有个感叹号,然后依赖spring-jdbc的别的模块也是提示依赖的模块spring-jdbc中有错误。记得Problem里面提示spring-jdbc项目缺少一个jar包,然后我在eclipse里面倒腾了半天,也没有将那个依赖弄好,最后没办法了,就自己手动下载,然后导入到项目里面。

我这里提示的是缺少​​derby-10.14.2.0.jar​​,所以我们直接在中央仓库里面搜这个依赖即可

使用eclipse导入spring-framework-5.0.x源码_gradle_18


使用eclipse导入spring-framework-5.0.x源码_Spring源码_19


下载到本地之后,我们需要将其放在gradle的本地仓库里面,我这里使用的路径是​​D:\gradle\local_repository​​,我们可以看一下gradle的jar包的目录

使用eclipse导入spring-framework-5.0.x源码_gradle_20


然后我们找到缺少的那个jar包的路径

使用eclipse导入spring-framework-5.0.x源码_spring_21


这里面有俩,我看了一下里面的目录是有固定套路的,里面是版本号文件夹,版本号文件夹里面还有两个随机命名的文件夹,一个文件夹里面放了pom文件,另一个文件夹放了jar文件,我的​​derby-project​​文件夹下面只有一个pom文件所在的随机文件夹,于是我便自己新建了一个文件夹,然后把刚才下载的jar包扔里面

使用eclipse导入spring-framework-5.0.x源码_Spring源码_22


接着在Eclipse里面手动指定jar的位置。

右键spring-jdbc项目---Build Path-----Config Build Path

使用eclipse导入spring-framework-5.0.x源码_xml_23


可以看到这里这个jar包的位置就是刚才手动创建的。这是修改之后的,修改之前这个异常的jar信息应该是在jar包列表的最后一行,选中异常的jar,点击右侧的Edit即可手动指定其位置。

然后点击Apply and Close 给Eclipse一点反应的时间,直到所有的子项目都没有错误信息,就可以开始下一步了。

然后回到cmd窗口,按任意键,提示进入第三步

使用eclipse导入spring-framework-5.0.x源码_spring_24

3. 生成根目录

cmd窗口中提示,第三步,提示的大致意思:

不幸的是,eclipse不允许导入项目层次结构,因此我们不得不在过程中跳过根项目元数据的生成

貌似是提示我们:刚才我们导入的项目,只是一些分离的子项目,我们需要一个父项目。那就按任意键,接着往下走,接着编译

使用eclipse导入spring-framework-5.0.x源码_xml_25


不出意外的话,会顺利出现绿条,然后接着第四步。

4. 导入根项目到eclipse中

使用eclipse导入spring-framework-5.0.x源码_gradle_26

重复第二步,导入根项目,然后可以看到Eclipse里面新导入一个名为​​spring​​的项目,包含了所有第二步导入的子项目,这样我们就可以在代码中在多个模块之间来回切换了。

使用eclipse导入spring-framework-5.0.x源码_Spring源码_27


使用eclipse导入spring-framework-5.0.x源码_spring_28


从第四步的提示中,看到还要最后一步呢,但是当我完成第四步之后回到cmd窗口,敲了回车之后,没反应,连敲了两次回车之后,cmd窗口一闪就消失了。。。。。。。

不知道最后一步是什么操作,但是又没有影响我后面的操作。

但是到目前为止,我们已经顺利把源码导入到eclipse里面了。

这里创建一个简单的测试,开始我们的第一个demo之旅吧。

使用eclipse导入spring-framework-5.0.x源码_gradle_29


其中红框选中的就是我们自己写的测试demo了。

首先是新建一个简单的实体类​​MyTestBean.java​​,然后使用xml文件,让Spring将我们这个类添加到容器中。

package my.test.bean;


/**
*
* @author linmengmeng
* @since 5.0
*/
public class MyTestBean {

private String testStr = "testStr";


/**
* @return the testStr
*/
public String getTestStr() {
return testStr;
}


/**
* @param testStr the testStr to set
*/
public void setTestStr(String testStr) {
this.testStr = testStr;
}

}

然后是xml文件的内容,很简单,就是使用​​<bean>​​​标签,来告诉Spring需要将这个类装载到容器里面。
beanFactoryTest.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="myTestBean" class="my.test.bean.MyTestBean"></bean>

</beans>

最后是我们的测试文件:​​BeanFactoryTest.java​

package my.test.bean;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import .ClassPathResource;

import static org.junit.Assert.*;

/**
*
* @author linmengmeng
* @since 5.0
*/
@SuppressWarnings("deprecation")
public class BeanFactoryTest {

@Test
public void testSimpleLoad() {
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("/my/test/bean/beanFactoryTest.xml"));
MyTestBean testBean = (MyTestBean) beanFactory.getBean("myTestBean");
assertEquals("testStr", testBean.getTestStr());
}
}

右键​​testSimpleLoad​​方法,Run as 可以看到左侧的小绿条,证明我们这个测试通过了。

使用eclipse导入spring-framework-5.0.x源码_spring_30


看到绿条出现的那一刻,真的是舒服,折腾了半天终于弄好了,哈哈。

看似简单的几行代码,Spring究竟做了哪些工作呢?这个就是我们需要了解的了。源码之旅从今天就开始了,小伙伴们让我们一起学习吧,后续有机会我会接着分享自己的源码学习记录。

最后贴上一份知秋大佬翻译的Spring源码的中文文档,感觉是真的良心之作了,对于我这种英语渣渣来说,中英文对照看,是真的太棒了。

​Spring Framework 5.0.0.M3中文文档​

​Spring Framework 5.0.0.M3英文文档 ​​ 提取码: xvdy

​备用地址:​​ 提取码: t6mi

​Spring Framework 各个版本源码文档(英文)​​​ 可以下载PDF文档,比如我需要下载​​5.0.0.M3​​​版本的文档,打开前面的链接之后,选择​​5.0.0.M3​​​,然后依次打开目录​​5.0.0.M3/spring-framework-reference/pdf/spring-framework-reference.pdf​​,在预览界面上右键,然后另存为即可。


补充:

1. AJDT插件的安装


本来打算把自己写的测试用例同步到github上呢,结果把项目给弄崩了,然后试着这个博客再重新编译了一次,完美编译和上传到github上。不过这次搞好了那个AspectJ插件的安装,虽然版本和我用的Eclipse版本不一致,但还是装上了。

这里放上AJDT的页面链接:https://www.eclipse.org/ajdt/downloads/

使用eclipse导入spring-framework-5.0.x源码_spring_31


目前最新的版本是适用于Eclipse 4.10的,我使用的是4.11,但是我还是装了这个。