重学SpringBoot3-SpringBoot可执行JAR的原因

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

Spring Boot 的一个核心特性是它的可执行 JAR(通常称为“Fat JAR”或“Uber JAR”),这种 JAR 文件包含了应用程序所有的依赖库,使得应用可以通过简单的 java -jar 命令独立运行。这个特性极大地简化了部署流程,使得 Spring Boot 应用可以轻松地在各种环境中部署和运行,不再依赖特定的应用服务器。下面将介绍 Spring Boot 可执行 JAR 的工作原理和它是如何实现独立运行的。

Spring Boot可执行JAR的结构

Spring Boot 的可执行 JAR 不同于传统的 JAR 文件。传统的 JAR 文件通常只包含应用程序的类和资源文件,而所有的依赖库则需要以某种方式(如放在一个共享的类路径中)单独提供。相比之下,Spring Boot 的可执行 JAR 包含了应用程序及其所有依赖的库,还包括一个嵌入式的 Servlet 容器(如 Tomcat、Jetty 或 Undertow),以及一段特殊的启动引导代码。

打包运行

打包

命令行中输入 java -jar xxx.jar 即可运行 jar 包。

运行jar

JAR 包内部结构

内部结构

一个 Spring Boot 可执行 JAR 的内部结构大致如下:

  • META-INF/:包含了 MANIFEST.MF 等元数据文件,MANIFEST.MF 中指定了主启动类(Main-Class)和类路径(Class-path)。
    • META-INF路径
    • pom文件
  • BOOT-INF/classes/:包含了应用程序的编译后的类文件。
    • 编译后的类文件和配置文件
  • BOOT-INF/lib/:包含了应用所有依赖的第三方库。
    • 依赖的库
  • org/:包含了 Spring Boot 的启动器类。
    • 启动类

工作原理

Spring Boot 可执行 JAR 的核心是它的启动器(Launcher)。当我们执行 java -jar 命令运行 Spring Boot 应用时,JVM 实际上是加载并执行 JAR 文件中指定的启动器类。启动器类的作用包括:

  1. 设置类加载器:启动器会创建一个自定义的类加载器来加载 BOOT-INF/classes/BOOT-INF/lib/ 中的类和库。这确保了应用程序能够访问到其依赖的所有库,即使这些库并不在 JVM 的默认类路径中。
  2. 启动嵌入式Servlet容器:启动器初始化并启动嵌入式的 Servlet 容器,比如 Tomcat。这个过程中,它会将应用程序部署到容器中。
  3. 启动Spring应用上下文:最后,启动器会启动 Spring 应用上下文,完成应用程序的初始化和 Bean 的装配过程。

优点

Spring Boot 的可执行 JAR 模式带来了多个优点:

  1. 简化部署:由于应用程序和它的所有依赖都包含在一个 JAR 文件中,部署应用变得非常简单。只需将 JAR 文件传输到服务器上,然后执行 java -jar 命令即可启动应用。
  2. 独立运行:应用不再依赖外部的 Servlet 容器或应用服务器。这减少了环境差异带来的问题,提高了应用的可移植性。
  3. 快速迭代:开发过程中,可以快速打包并运行应用,加速开发和测试流程。

总结

Spring Boot 的可执行 JAR 为 Java 应用的部署和运行提供了一种简单高效的方式。通过将应用程序和其所有依赖打包到一个独立的JAR文件中,并利用启动器动态加载这些依赖,Spring Boot 应用可以轻松地在任何提供了 Java 运行时环境的系统上运行。这种模式不仅优化了部署流程,还为应用的开发、测试和生产部署提供了极大的便利。随着微服务和云原生应用的兴起,Spring Boot 的这一特性无疑提供了巨大的价值。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 07:22:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 07:22:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 07:22:04       82 阅读
  4. Python语言-面向对象

    2024-04-02 07:22:04       91 阅读

热门阅读

  1. 详解Oracle数据库索引唯一扫描原理和优化方法

    2024-04-02 07:22:04       40 阅读
  2. windows证书服务器生成的ssl证书可以用吗

    2024-04-02 07:22:04       42 阅读
  3. 前端安全-面试题(2024)

    2024-04-02 07:22:04       43 阅读
  4. Stable Diffusion本地部署全攻略:从概念到实战

    2024-04-02 07:22:04       34 阅读
  5. AutoGluon

    2024-04-02 07:22:04       34 阅读
  6. jvm 调优的方式

    2024-04-02 07:22:04       36 阅读
  7. 【C/C++】C语言实现串

    2024-04-02 07:22:04       27 阅读
  8. ChatGPT:打破学术写作束缚

    2024-04-02 07:22:04       33 阅读
  9. 图论做题笔记:bfs

    2024-04-02 07:22:04       39 阅读
  10. APP自动化测试-Appium元素定位之元素等待

    2024-04-02 07:22:04       36 阅读