早在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打包方式。