SpringBoot复习:(4)打成的jar包是如何启动的?

jar包通过MANIFEST的Main-Class指定了主类JarLauncher,

JarLauncher的main方法代码如下:

其中调用的launch的代码如下:

首先,创建了一个自定义的ClassLoader,代码如下:

其中调用的重载的createClassLoader代码如下:

该方法返回的LauncherURLClassLoader类对象,LauncherURLClassLoader是URLClassLoader的子类。

其次,通过getMainClass获取主类,代码如下:

该方法会从jar包里MANIFEST.MF这个文件里读取Start-Class这个属性,

也就是我们自己定义的SpringBoot 应用的主类。

最后,调用launch(args, launchClass, classLoader); launch的代码如下:
该方法首先将之前创建出来的LauncherURLClassLoader类型的ClassLoader作为线程上下文类加载器,然后调用createMainMethodRunner,

然后调用其run方法,

在该方法中,首先使用线程上下文类加载器加载我们的SpringBoot 应用程序的启动类, 然后通过Class对象获取main方法,最后通过反射的方式调用main方法,也就真正启动了程序。

相关推荐
Bony-5 小时前
Go语言垃圾回收机制详解与图解
开发语言·后端·golang
好好研究7 小时前
SpringBoot - yml配置文件
java·spring boot·spring
JH307310 小时前
SpringBoot自定义启动banner:给项目加个专属“开机画面”
java·spring boot·后端
what丶k11 小时前
深度解析Redis LRU与LFU算法:区别、实现与选型
java·redis·后端·缓存
猿小羽11 小时前
AI 学习与实战系列:Spring AI + MCP 深度实战——构建标准化、可扩展的智能 Agent 系统
java·spring boot·llm·agent·spring ai·mcp·model context protocol
测试人社区-浩辰11 小时前
AI与区块链结合的测试验证方法
大数据·人工智能·分布式·后端·opencv·自动化·区块链
老友@12 小时前
分布式事务完全演进链:从单体事务到 TCC 、Saga 与最终一致性
分布式·后端·系统架构·事务·数据一致性
Coder_Boy_13 小时前
基于SpringAI的在线考试系统-数据库设计核心业务方案
java·数据库·spring boot·ddd·tdd
java1234_小锋13 小时前
Spring里AutoWired与Resource区别?
java·后端·spring
风象南13 小时前
Spring Boot 定时任务多实例互斥执行
java·spring boot·后端