Spring boot项目通过java命令启动的过程

本文详细解析了SpringBoot项目的启动过程,从java命令运行jar包开始,介绍了如何通过MANIFEST.MF文件找到主类,再到JarLauncher类的具体作用,最后到Start-Class属性所指定的应用程序入口。
摘要由CSDN通过智能技术生成
当使用java命令运行一个jar包时 实际上是运行jar包中的一个主类的main方法,在jar包的MANIFEST.MF文件中的Main-Class指定的;

Spring boot项目打包后的目录结构如下:
BOOT-INF
META-INF
org
springframework
boot
loader

所以Spring boot项目启动靠 springframework.boot.loader

解压Spring boot的一个项目包,打开MANIFEST.MF,发现:
Main-Class: org.springframework.boot.loader.JarLauncher

说明java命令运行Spring boot项目时实际上是运行了JarLauncher类

下面看下JarLauncher类都做了些什么
1.JarLauncher 类的main方法:
public static void main(String[] args) throws Exception {
new JarLauncher(). launch(args);
}

2.launch 方法
protected void launch(String[] args) throws Exception {
JarFile.registerUrlProtocolHandler();
ClassLoader classLoader = createClassLoader(getClassPathArchives());
launch(args, getMainClass(), classLoader);
}

这个方法中有一个关键语句: JarFile.registerUrlProtocolHandler();
注册一个自定义的Handler,处理“jar:”这样的协议,处理jar in jar 以及加载其他资源。
实际上是这个玩意下面的Handler:org.springframework.boot.loader

3. getMainClass()方法
@Override
protected String getMainClass() throws Exception {
Manifest manifest = this.archive.getManifest();
String mainClass = null;
if (manifest != null) {
mainClass = manifest.getMainAttributes().getValue("Start-Class");
}
if (mainClass == null) {
throw new IllegalStateException(
"No 'Start-Class' manifest entry specified in " + this);
}
return mainClass;
}

由此可见 最终运行的是 Start-Class方法

4.MANIFEST.MF文件中的Start-Class为:
Start-Class: com.fboot.FbootApplication






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值