详解SpringBoot的jar为什么可以直接运行

 更新时间:2024年02月25日 09:52:45   作者:飞翔的佩奇  
SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包,本文给大家介绍了为什么SpringBoot的jar可以直接运行,文中有相关的代码示例供大家参考,感兴趣的朋友可以参考下

一、为什么SpringBoot的jar可以直接运行?

1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。

2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的
类。

3.java -jar会去找jar中的manifest文件,在那里面找到真正的启动类(Main-Class);

4.Fat jar的启动Main函数是JarLauncher,它负责创建一个LaunchedURLClassLoader来加载boot-lib下面的jar,并以一个新线程启动应用的启动类的Main函数(找到manifest中的Start-Class)。

二、知识延伸

Spring Boot可以使用JAR包启动的原因

  1. 嵌入式Servlet容器:Spring Boot默认使用嵌入式的Servlet容器(如Tomcat、Jetty、Undertow等)。这使得应用程序可以打包成一个可执行的JAR文件,包含了所有的依赖以及一个嵌入式的Servlet容器,而无需外部容器的支持。

  2. Spring Boot Maven插件:Spring Boot提供了Maven和Gradle插件,可以将应用程序打包成可执行的JAR文件。这个JAR文件中包含了应用程序的所有依赖以及一个主类,使得它可以被直接运行。

  3. 自动化配置:Spring Boot采用自动化配置的方式,大大减少了开发者的配置工作。这使得应用程序可以更容易地打包成一个独立的可执行JAR文件,而不需要太多手动配置。

  4. 内嵌属性文件:Spring Boot支持使用application.properties或application.yml文件来配置应用程序。这些配置文件可以被打包进JAR文件,使得应用程序在不同环境中可以方便地切换配置。

总的来说,Spring Boot通过嵌入式Servlet容器、构建工具插件以及自动化配置等机制,使得应用程序可以方便地打包成一个JAR文件,并通过java -jar命令直接运行。这种方式简化了部署和运维的流程。

原理

在Spring Boot项目的jar中会生成一个MANIFEST.MF文件(路径:META-INF\MANIFEST.MF),打开该文件你会看到有一个MainClass的映射,其对应的值是一个类,就是执行‘java -jar’命令后正式执行的类,mainclass类是springboot插件引入后自动添加的

Manifest-Version: 1.0
Implementation-Title: executable-jar
Implementation-Version: 1.0-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: Format
Start-Class: spring.study.executablejar.ExecutableJarApplication
Implementation-Vendor-Id: spring.study
Spring-Boot-Version: 1.3.5.RELEASE
Created-By: Apache Maven 3.2.3
Build-Jdk: 1.8.0_20
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher

如果想看JarLauncher类的源码需要手动引入‘spring-boot-loader’依赖,其实声明‘spring-boot-maven-plugin’插件也会自动引入其依赖,但不能查看到源码内容

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-loader</artifactId>
</dependency>

打开之后可以看到此类有一个主程序入口,main方法

protected void launch(String[] args) throws Exception {
   JarFile.registerUrlProtocolHandler();
   //自定义类加载器加载jar文件
   ClassLoader classLoader = createClassLoader(getClassPathArchives());
   //关注getMainClass方法
   launch(args, getMainClass(), classLoader);
}

到此这篇关于详解为什么SpringBoot的jar可以直接运行的文章就介绍到这了,更多相关SpringBoot jar直接运行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java键值对Pair的使用方式和操作实现

    Java键值对Pair的使用方式和操作实现

    键值对是一种常见的数据结构,它由一个唯一的键和与之关联的值组成,本文就来介绍一下Java键值对Pair的使用方式和操作实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 关于SpringBoot微服务发布与部署的三种方式

    关于SpringBoot微服务发布与部署的三种方式

    SpringBoot 框架只提供了一套基于可执行 jar 包(executable jar)格式的标准发布形式,但并没有对部署做过多的界定,而且为了简化可执行 jar 包的生成,SpringBoot 提供了相应的 Maven 项目插件,需要的朋友可以参考下
    2023-05-05
  • 关于Java中配置ElasticSearch集群环境账号密码的问题

    关于Java中配置ElasticSearch集群环境账号密码的问题

    这篇文章主要介绍了Java中配置ElasticSearch集群环境账号密码的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • SpringBoot服务设置禁止server.point端口的使用

    SpringBoot服务设置禁止server.point端口的使用

    本文主要介绍了SpringBoot服务设置禁止server.point端口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • MyBatis 核心配置文件及映射文件详解

    MyBatis 核心配置文件及映射文件详解

    MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,本文重点介绍MyBatis 核心配置文件及映射文件,需要的朋友可以参考下
    2023-01-01
  • Spring依赖注入中的@Resource与@Autowired详解

    Spring依赖注入中的@Resource与@Autowired详解

    这篇文章主要介绍了Spring依赖注入中的@Resource与@Autowired详解,提到Spring依赖注入,大家最先想到应该是@Resource和@Autowired,对于Spring为什么要支持两个这么类似的注解却未提到,属于知其然而不知其所以然,本文就来做详细讲解,需要的朋友可以参考下
    2023-09-09
  • Java springboot 配置文件与多环境配置与运行优先级

    Java springboot 配置文件与多环境配置与运行优先级

    这篇文章主要介绍了Java springboot如何配置文件,进行多环境配置,以及运行优先级,感兴趣的小伙伴可以借鉴一下
    2023-04-04
  • Spring定时任务关于@EnableScheduling的用法解析

    Spring定时任务关于@EnableScheduling的用法解析

    这篇文章主要介绍了Spring定时任务关于@EnableScheduling的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • java如何获取map中value的最大值

    java如何获取map中value的最大值

    这篇文章主要介绍了java如何获取map中value的最大值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java的RocketMq队列之消息可靠性详解

    Java的RocketMq队列之消息可靠性详解

    这篇文章主要介绍了Java的RocketMq队列之消息可靠性详解,生产者通过网络发送消息给 Broker,当 Broker 收到之后,将会返回确认响应信息给 Producer,所以生产者只要接收到返回的确认响应,就代表消息在生产阶段未丢失,需要的朋友可以参考下
    2024-01-01

最新评论