前言
我们平时天天写项目,一直用的spring,个人觉得,每天都在面对spring,确从来没有编译过spring源码,有点不太合适,所以今天我们就来编译一下源码环境,顺便做一个笔记。
这里给出我的配置:JDK1.8.0_172,IntelliJ IDEA 2019.1 (Ultimate Edition),gradle-5.4。
注意:gradle版本需要4.2以上
第一步:保证我们环境已经全部准备完毕。
第二步:下载spring源码,源码下载地址:https://github.com/spring-projects/spring-framework,这里我下载的zip。
第三步:解压项目,然后导入idea,等待导入完毕后,我们需要注意一个文件,import-into-idea.md,内容如下:
1. `spring-core` and `spring-oxm` should be pre-compiled due to repackaged dependencies.
因为其他项目需要依赖spring-core和spring-oxm,所以我们导入后需要先编译这两个包。先编译这两个项目
第四步:在编译前需要注意,在使用工具编译时,可能会出现内存溢出情况,这里我们编译时需要增加相关参数
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m
如图:
注意:这里曾经猜过的坑,jdk版本,不能太高,我曾经使用jdk1.8_20和jdk1.8_191编译,均会出现版本问题,我后来采用的是,1.8_131,1.8.0_172版本,即可成功
第五步:如果上面的步骤都完成了,那么开始编译吧,由于要下载gradle仓库jar包,需要时间比较长(我这里需要了26分钟),拼机器性能和网速的时候到了
编译成功后(不代表完全成功,需要测试成功才是最终的成功),编译成功后如下图:
使用刚刚编译的spring源码构建spring项目,在工程目录下,新建moudle,引入对应的依赖
新建项目完成后如下,引入依赖,并添加测试类
UserDao
package com.zoo.dao;
import org.springframework.stereotype.Repository;
/**
* @author: 谢飞
*/
@Repository
public class UserDao {
public void printInfo() {
System.out.println("user dao");
}
}
AppConfig
package com.zoo.utils;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @author: 谢飞
*/
@Configuration
@ComponentScan("com.zoo")
public class AppConfig {
}
Test
package com.zoo;
import com.zoo.dao.UserDao;
import com.zoo.utils.AppConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author: 谢飞
*/
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
UserDao userDao = ac.getBean(UserDao.class);
userDao.printInfo();
}
}
点击运行报错如下:
正确做法是spring-context.gradle修改 optional(project(":spring-instrument"))为 compile(project(":spring-instrument")),
然后重新build项目spring-context,然后点击运行
最终控制台输出:
项目构建完成,正确输出。至此,spring5.1.x项目构建编译完成。