面试官:为什么SpringBoot的 jar 可以直接运行?

引言

  • 传统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标签,指定mainClassrepackage目标。

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-ClassSpring-Boot-Lib

内嵌Web容器

  • 内嵌容器:如Apache Tomcat、Jetty、Undertow、Reactor Netty。
  • 优点
    • 简化部署,只需分发单一的JAR文件。
    • 加快启动速度,实现热重启。
    • 提高稳定性,减少环境差异导致的问题。

自动配置与类路径扫描

  • 自动配置
    • 读取resource/META-INF/spring.factories文件,列出所有可用的自动配置类。
    • 使用条件注解(如@ConditionalOnClass@ConditionalOnMissingBean)智能判断何时应用特定的配置。
  • @SpringBootApplication注解
    • 包含@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
    • 启用自动配置,自动扫描和管理Spring组件。

总结

  • 直接运行原因
    1. Fat/Uber JAR:使用maven插件将项目及其所有依赖项打包成一个单一的jar文件。
    2. Manifest.MF:指定Main-Class属性,指向Spring Boot的启动类。
    3. 嵌入式Servlet容器:集成如Tomcat等嵌入式Web容器。
    4. 启动器类加载器:解压并加载内部依赖库,定位到实际的应用主类。
    5. 类路径扫描和自动配置:识别应用所依赖的服务和组件,并自动配置。
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值