引言
- 传统Java应用部署:需要将应用打包成WAR文件,部署到如Apache Tomcat、Jetty等Web容器中。
- Spring Boot:改变了Java应用的开发体验,应用可以打包成可直接运行的jar文件,无需外部容器。
SpringBoot JAR包基础概念
- Fat JAR(胖Jar):
- 包含应用程序所需的全部依赖库和应用程序自身的类文件。
- 自包含,只需分发一个文件即可部署应用。
- 适合云端部署或无网络环境下的安装。
Spring Boot应用打包机制
- Maven或Gradle插件:构建可执行的Fat JAR。
- Maven示例:
- 使用
spring-boot-maven-plugin
插件进行打包。 - 配置
pom.xml
中的build
标签,指定mainClass
和repackage
目标。
- 使用
Spring Boot应用打包机制详解
- Fat JAR内容:
META-INF/
:包含MANIFEST.MF文件和其他元数据信息。BOOT-INF/classes/
:存放项目自身的类文件和资源文件。BOOT-INF/lib/
:放置所有依赖的jar包。
Spring Boot启动器与Loader机制
- MANIFEST.MF文件:包含JAR包的基本信息和运行指令。
- 启动器类加载器:
org.springframework.boot.loader.JarLauncher
:用于启动Spring Boot应用程序。- 读取MANIFEST.MF中的附加属性,如
Start-Class
和Spring-Boot-Lib
。
内嵌Web容器
- 内嵌容器:如Apache Tomcat、Jetty、Undertow、Reactor Netty。
- 优点:
- 简化部署,只需分发单一的JAR文件。
- 加快启动速度,实现热重启。
- 提高稳定性,减少环境差异导致的问题。
自动配置与类路径扫描
- 自动配置:
- 读取
resource/META-INF/spring.factories
文件,列出所有可用的自动配置类。 - 使用条件注解(如
@ConditionalOnClass
、@ConditionalOnMissingBean
)智能判断何时应用特定的配置。
- 读取
- @SpringBootApplication注解:
- 包含
@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
。 - 启用自动配置,自动扫描和管理Spring组件。
- 包含
总结
- 直接运行原因:
- Fat/Uber JAR:使用maven插件将项目及其所有依赖项打包成一个单一的jar文件。
- Manifest.MF:指定Main-Class属性,指向Spring Boot的启动类。
- 嵌入式Servlet容器:集成如Tomcat等嵌入式Web容器。
- 启动器类加载器:解压并加载内部依赖库,定位到实际的应用主类。
- 类路径扫描和自动配置:识别应用所依赖的服务和组件,并自动配置。