Spring Boot 应用程序被打包成的jar包之所以可以直接通过 java -jar
命令运行,是因为Spring Boot在构建过程中做了一些特殊的设计和配置。具体原因:
- Fat/Uber JAR: Spring Boot使用maven插件
spring-boot-maven-plugin
(或Gradle对应的插件)将项目及其所有依赖项打包成一个单一的、自包含的jar文件,通常称为“Fat JAR”或“Uber JAR”。这意味着不仅包含了自己的类文件,还包含了运行应用所需的所有第三方库。 - Manifest.MF: 在打包过程中,此插件会修改MANIFEST.MF文件,这是jar包中的一个元数据文件。在MANIFEST.MF中,特别指定了
Main-Class
属性,该属性指向Spring Boot的一个内置的启动类(如org.springframework.boot.loader.JarLauncher
),这个启动器类知道如何正确启动Spring Boot应用程序。 - 嵌入式Servlet容器:Spring Boot默认集成了诸如Tomcat、Jetty或Undertow等嵌入式Web容器,使得无需外部服务器环境也能运行Web应用。
- 启动器类加载器:当通过
java -jar
运行Spring Boot应用时,JVM会根据MANIFEST.MF中的Main-Class
找到并运行指定的启动器类。这个启动器类加载器能够解压并加载内部的依赖库,并定位到实际的应用主类(在spring-boot-starter-parent
或@SpringBootApplication
注解标记的类),进而执行其main
方法。 - 类路径扫描和自动配置:Spring Boot应用通过特定的类路径扫描机制和自动配置功能,能够在启动时识别出应用所依赖的服务和组件,并自动配置它们,大大简化了传统Java应用的配置和部署过程。