相比于传统的Java打包方式,使用SpringBoot打包插件打包成jar包后,可以直接使用java -jar
运行SpringBoot项目,本篇就来分析一下运行的原理。
SpringBoot打包插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
打包完后会生成两个文件,一个***.jar
和***.jar.original
.jar
文件是SpringBoot打包后生成的文件,.jar.original
是用原生方式打包生成的文件,对比一下两个的区别
.jar.original
文件
.jar
文件
.jar.original
就是普通的jar打包的结构,这里主要看.jar
文件的结构:
-
META-INFO目录:META-INFO/MANIFEST.MF里包含了jar包的元数据,包含了项目的启动类等信息.
-
org目录:该目录下包含的是启动项目的一些类,启动的过程就在这个包里。
-
BOOT-INFO目录:本地项目的代码(BOOT-INF/classes),以及所需的依赖(BOOT-INFO/lib)
重点在META-INFO/MANIFEST.MF里:
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.4.5
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher
这里有几个重点的字段
- Main-Class :jar包启动类,这是java规定的字段,存在这个字段的情况下, 在
java -jar
时,jar包才会运行起来 - Start-Class:本地项目的启动类
- Spring-Boot-Classes:加载应用类的入口
- Spring-Boot-Lib:项目所需的依赖
有了Main-Class启动类,那就直接进入到JarLauncher
里查看运行的过程
public static void main(String[] ar