spring5.x源码编译

目录

1.前言

2.环境准备

3.开始构建

 3.1预编译

可能出现的错误

3.2导入idea

3.3配置idea

3.4编译

可能出现的错误

4.验证


1.前言

最近准备学习spring源码,第一件事情就是编译spring,由于最新的5.x源码使用gradle进行编译,然后我按照网上的方法,尝试了很多次,没有一次成功,最终还是只能自己摸索编译。记录一下方法,防止下次编译的时候再走弯路。

2.环境准备

本地编译spring源码我使用的软件版本如下:

  • 系统:macOS Ventura
  • idea:2022.3.3
  • gradle:不需要安装,很多博文上都说需要提前安装
  • jdk版本:17。需要提前在官网下载安装,因为要在idea中进行配置
  • 源码:最新版本。直接去spring的github仓库进行clone即可。不过我建议你fork到你本地之后再clone下来,如果github网络不好的话,那么就去gitee仓库进行克隆吧!

3.开始构建

 3.1预编译

根据import-into-idea.md中提到的,我们先进行两次预编译(下载对应的gradle版本):

  • 预编译spring-oxm。通过终端进入spring-oxm目录,执行命令:
../gradlew :spring-oxm:compileTestJava
  • 预编译spring-core。通过终端进入spring-core目录,执行命令
../gradlew :spring-core:compileTestJava

可能出现的错误

提示plugin无法找到:


提示无效的发行版本17:

上述错误都不需要处理。直接进入下一步即可。 

3.2导入idea

(File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)

3.3配置idea

配置项目结构:导入你下载的jdk17;项目和模块中的SDK选择你导入的jdk17


配置gradle中的jdk为17

3.4编译

使用idea的gradle进行编译操作,点击刷新按钮,等待编译完成。


怎么判断是否成功?除了控制台的输出之外(我没有截图保存),还可以参考下图,点开spring,能展开的话,也能说明成功了。


编译成功之后,要卸载spring-aspects模块,防止idea编译错误。右键模块,选择`加载/卸载模块...`

可能出现的错误

spring-core包中的`Objenesis`提示无法找到,重新加载对应模块即可


同理,如果还有其他模块提示对应的包无法找到的话,都可以执行这个操作。

4.验证

新建一个spring-learn学习模块

 

新建模块之后,修改模块下的build.gradle文件(这里注意,不要加入其他依赖),然后编译spring-study模块

dependencies {
    api(project(":spring-beans"))
    api(project(":spring-core"))
    api(project(":spring-context"))
    api(project(":spring-aop"))
}

新建如下三个测试类

@Configuration
@ComponentScan
public class JavaConfig {

	@Bean
	public User user() {
		User user = new User();
		user.setUserName("xxx");
		user.setAge(29);
		return user;
	}

}

// 一定不要引入lombok的东西,否则会出现奇奇怪怪的错误。
public class User {

	private String userName;
	private Integer age;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}
}


public class App {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
		User user = (User) context.getBean("user");
		System.out.println(user.getUserName() + ":" + user.getAge());
	}

}

执行main方法,会看到如下输出

 至此,编译工作完成。

 如有错误,欢迎留言交流。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麋鹿叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值