springboot启动(1) -- jar启动逻辑

早在springboot之前,就存在jar方式启动web应用的途径。

  • tomcat maven插件方式
    tomcat maven插件是将应用程序与tomcat打包为一个jar,对应的jar配置文件MANIFEST.MF中的main class是tomcat,tomcat启动后通过servlet3支持的spi技术完成应用的装载。

springboot jar启动又是怎么实现的呢?

解压一个打包好的springboot jar包目录如下:

├── BOOT-INF
│   ├── classes
│   ├── lib
├── META-INF
│   ├── MANIFEST.MF
│   ├── maven
└── org
    └── springframework
        └── boot
            └── loader

BOOT-INF: 应用程序类合依赖的lib包
META-INF: jar配置文件
org:spring启动类JarLaucher所在包

查看 MANIFEST.MF:

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: learn
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.mx.learn.LearnApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.4.1
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher

该文件有别于传统的jar配置信息,前面多了很多spring的配置项。其中启动类为:org.springframework.boot.loader.JarLauncher
其实,springboot为了支持jar启动,在jar外层又包装了一个启动类JarLauncher,用来支持嵌套jar包的读取。JarLauncher将springboot打包内容按照官方结构组装好后再启动应用主类。
参考:https://blog.csdn.net/kaihuishang666/article/details/108405691

另外,org包下也有个WarLauncher类,这是说明springboot也兼容传统war打包方式。

你可能感兴趣的:(springboot启动(1) -- jar启动逻辑)