spring boot executable jar/war 原理解析

 更新时间:2023年02月06日 09:53:44   作者:横云断岭  
spring boot里其实不仅可以直接以 java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如./demo.jar,这篇文章主要介绍了spring boot executable jar/war 原理,需要的朋友可以参考下

spring boot executable jar/war

spring boot里其实不仅可以直接以 java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如./demo.jar

把这个executable jar/war 链接到/etc/init.d下面,还可以变为linux下的一个service。

只要在spring boot maven plugin里配置:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

这样子打包出来的jar/war就是可执行的。更多详细的内容可以参考官方的文档。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment-install

zip格式里的magic number

生成的jar/war实际上是一个zip格式的文件,这个zip格式文件为什么可以在shell下面直接执行?

研究了下zip文件的格式。zip文件是由entry组成的,而每一个entry开头都有一个4个字节的magic number:

Local file header signature = 0x04034b50 (read as a little-endian number)
即 PK\003\004

参考:https://en.wikipedia.org/wiki/Zip_(file_format)

zip处理软件是读取到magic number才开始处理。所以在linux/unix下面,可以把一个bash文件直接写在一个zip文件的开头,这样子会被认为是一个bash script。 而zip处理软件在读取这个文件时,仍然可以正确地处理。

比如spring boot生成的executable jar/war,的开头是:

#!/bin/bash
#
#    .   ____          _            __ _ _
#   /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
#  ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
#   \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
#    '  |____| .__|_| |_|_| |_\__, | / / / /
#   =========|_|==============|___/=/_/_/_/
#   :: Spring Boot Startup Script ::
#

在script内容结尾,可以看到zip entry的magic number:

exit 0
PK^C^D

spring boot的launch.script

实际上spring boot maven plugin是把下面这个script打包到fat jar的最前面部分。

https://github.com/spring-projects/spring-boot/blob/1ca9cdabf71f3f972a9c1fdbfe9a9f5fda561287/spring-boot-tools/spring-boot-loader-tools/src/main/resources/org/springframework/boot/loader/tools/launch.script

这个launch.script 支持很多变量设置。还可以自动识别是处于auto还是service不同mode中。

所谓的auto mode就是指直接运行jar/war:

./demo.jar

service mode则是由操作系统在启动service的情况:

service demo start/stop/restart/status

所以fat jar可以直接在普通的命令行里执行,./xxx.jar 或者link到/etc/init.d/下,变为一个service。

总结

  • jar/war实际就是zip格式
  • spring-boot-maven-plugin把启动脚本打到executable jar/war的最前面
  • 脚本的最后一行是exit 0,脚本只执行自己的内容,不会执行到jar/war里的内容
  • zip文件由多个entry组成,entry的开头有magic number,所以zip处理软件可以跳过前面的脚本,准确找到zip entry

到此这篇关于spring boot executable jar/war 原理的文章就介绍到这了,更多相关spring boot executable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java面试必问之ThreadLocal终极篇分享

    Java面试必问之ThreadLocal终极篇分享

    ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量),这篇文章主要给大家介绍了关于Java面试必问之ThreadLocal终极篇的相关资料,需要的朋友可以参考下
    2021-10-10
  • JAVA实现打印ascii码表代码

    JAVA实现打印ascii码表代码

    这篇文章主要介绍了JAVA实现打印ascii码表代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Spring使用AspectJ的注解式实现AOP面向切面编程

    Spring使用AspectJ的注解式实现AOP面向切面编程

    这篇文章主要介绍了Spring使用AspectJ的注解式实现AOP面向切面编程的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Idea配置Maven阿里云镜像加速的实现

    Idea配置Maven阿里云镜像加速的实现

    这篇文章主要介绍了Idea配置Maven阿里云镜像加速的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Springboot视频接口报大量的ClientAbortException找不到原因的解决

    Springboot视频接口报大量的ClientAbortException找不到原因的解决

    本文主要介绍了Springboot视频接口报大量的ClientAbortException找不到原因的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 深入探究SpringBoot中的Sleuth用法

    深入探究SpringBoot中的Sleuth用法

    Sleuth是一个分布式跟踪系统,用于跟踪应用程序中的请求和操作,在本文中,我们将探讨SpringBoot中的Sleuth是什么,以及如何使用它来跟踪应用程序中的请求和操作,感兴趣的小伙伴跟着小编一起来探讨吧
    2023-07-07
  • 记录一次connection reset 错误的解决全过程

    记录一次connection reset 错误的解决全过程

    这篇文章主要介绍了记录一次connection reset 错误的解决全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring框架基于注解开发CRUD详解

    Spring框架基于注解开发CRUD详解

    这篇文章主要为大家详细介绍了Spring框架基于注解开发CRUD,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 浅析java创建文件和目录

    浅析java创建文件和目录

    这篇文章主要介绍了浅析java创建文件和目录的关键技术点以及演示示例,是篇非常不错的文章,有需要的朋友可以参考下
    2014-09-09
  • SpringMVC注解之@ResponseBody注解原理

    SpringMVC注解之@ResponseBody注解原理

    今天带大家分析一下@ResponseBody注解原理,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05

最新评论