为什么 Spring Boot 项目可以直接执行?(从打包到启动的完整原理)
Spring Boot 项目能通过 java -jar xxx.jar 直接执行,核心原因是它打包生成的并非普通 JAR 文件,而是经过 spring-boot-maven-plugin 特殊处理的可执行 JAR(Executable JAR)—— 这种 JAR 内置了 “启动器” 和 “自定义类加载器”,能自动加载依赖、初始化 Spring 上下文,最终启动应用。从 “打包结构→启动器原理→类加载机制” 三个维度,彻底讲透 Spring Boot 直接执行的底层逻辑。
先明确:Spring Boot 打包的不是普通 JAR
普通 Java 项目打包的 JAR(如 Maven 的 jar 插件生成的)仅包含项目自身的 .class 文件,无法直接通过 java -jar 执行(会报 “没有主清单属性” 错误),因为它缺少两个关键要素:
- 明确的 “启动类” 配置(告诉 JVM 入口在哪);
- 依赖的第三方 JAR 包(普通 JAR 不会包含依赖,需手动指定类路径)。
而 Spring Boot 项目通过 spring-boot-maven-plugin 打包后,生成的 JAR 结构和配置完全不同 —— 它解决了 “依赖加载” 和 “启动入口” 两个核心问题
关键文件:MANIFEST.MF 中的启动配置
MANIFEST.MF 是 JAR 文件的 “清单文件”,位于 META-INF/ 目录下,用于描述 JAR 的元信息(如版本、主类)。Spring Boot 生成的 MANIFEST.MF 包含 3 个核心配置,直接决定了 “能否直接执行”:
