文章内容过长,文末有彩蛋!希望大家多多关注
FatJar 解压之后的文件目录
从 Spring 官网 或者通过 Idea 创建一个新的 SpringBoot 工程,方便起见,建议什么依赖都不加,默认带入的空的 SpringBoot 工程即可。
通过 maven 命令进行打包,打包成功之后得到的构建产物截图如下:
在前面的文章中有提到,jar 包是zip 包的一种变种,因此也可以通过 unzip 来解压
unzip -q guides-for-jarlaunch-0.0.1-SNAPSHOT.jar -d mock
解压的 mock 目录,使用 tree 指令,看到整个解压之后的 FatJar 的目录结构如下(部分省略):
.
├── BOOT-INF
│ ├── classes
│ │ ├── application.properties # 用户-配置文件
│ │ └── com
│ │ └── glmapper
│ │ └── bridge
│ │ └── boot
│ │ └── BootStrap.class # 用户-启动类
│ └── lib
│ ├── jakarta.annotation-api-1.3.5.jar
│ ├── jul-to-slf4j-1.7.28.jar
│ ├── log4j-xxx.jar # 表示 log4j 相关的依赖简写
│ ├── logback-xxx.jar # 表示 logback 相关的依赖简写
│ ├── slf4j-api-1.7.28.jar
│ ├── snakeyaml-1.25.jar
│ ├── spring-xxx.jar # 表示 spring 相关的依赖简写
├── META-INF
│ ├── MANIFEST.MF
│ └── maven
│ └── com.glmapper.bridge.boot
│ └── guides-for-jarlaunch
│ ├── pom.properties
│ └── pom.xml
└── org
└── springframework
└── boot
└── loader
├── ExecutableArchiveLauncher.class
├── JarLauncher.class
├── LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class
├── LaunchedURLClassLoader.class
├── Launcher.class
├── MainMethodRunner.class
├── PropertiesLauncher$1.class
├── PropertiesLauncher$ArchiveEntryFilter.class
├── PropertiesLauncher$PrefixMatchingArchiveFilter.class
├── PropertiesLauncher.class
├── WarLauncher.class
├── archive
│ ├── # 省略
├── data
│ ├── # 省略
├── jar
│ ├── # 省略
└── util
└── SystemPropertyUtils.class
简单来看,FatJar 解压之后包括三个文件夹:
├── BOOT-INF # 存放的是业务相关的,包括业务开发的类和配置文件,以及依赖的jar
│ ├── classes
│ └── lib
├── META-INF # 包括 MANIFEST.MF 描述文件和 maven 的构建信息
│ ├── MANIFEST.MF
│ └── maven
└── org # SpringBoot 相关的类
└── springframework
我们平时在 debug SpringBoot 工程的启动流程时,一般都是从 SpringApplication#run