spring boot executable jar/war 原理

spring boot executable jar/war 原理

@(java)[spring boot, 帮助]

  • 通过org.springframework.boot 配置true 可以在jar文件的最前面增加一段脚本,不影响jar执行,同时可以直接java命令或者以服务的方式启动

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/v1.5.18.RELEASE/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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值