SpringBoot项目打包后的项目结构(以jar包为例)
根目录 |-- BOOT-INF
|-- classes
|-- lib |-- META-INF |-- org
- BOOT-INF 目录
- classes 目录中存放项目代码对应的 .class文件
- lib 目录中存放项目相关的依赖包,依赖包以 jar包 的方式存放(jar文件中存放jar文件,有个专门称呼叫 “FatJar”
- META-INF
- 存放清单文件,其内容描述当前可执行 jar 包的基本信息
- 其中,有两个主要的描述信息:
- Main-Class
-
描述 jar包 的入口文件(main 方法所在的类)
-
Spring 框架固定是
org.springframework.boot.loader.JarLauncher
-
定义完此属性后,一定要有一个换行
-
- Start-Class
-
描述自定义 main 方法的全称
-
- Main-Class
- org
-
存放了一些打包 SpringBoot 项目后的相关启动类
-
由于 SpringBoot 基于管理及安全性的考虑,打包使用 “项目代码与依赖包分离” 的方式(不同于以前将所有依赖包中的 .class 文件与项目的 .class 文件合并到一起的方式),因此打包后的 jar/war 包中依然包含了依赖的 jar 包,不符合 jar包 的规范,依赖的 jar包 无法通过默认的加载器进行加载
-
为了规避 jar文件规范,SpringBoot 使用自定义加载器去加载整个项目,于是入口就不再是编写项目时的 main 方法,而是使用
org.springframework.boot.loader.JarLauncher
类,在启动的时候创建自定义加载器去加载项目中的所有类 -
因此,打包后的 SpringBoot 项目,只有
org
文件夹中的类的类加载器是AppClassLoader
,BOOT-INF
文件夹中的类和依赖包的加载器是LaunchedURLClassLoader
-
war包的结构跟jar包结构差不多,只是多了几个目录(如 “WEB-INF/” 等)。