文档章节

Spring Boot Executable jar/war 原理

 横云断岭
发布于 2018/12/09 00:37
字数 664
阅读 227
收藏 6

「深度学习福利」大神带你进阶工程师,立即查看>>>

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

公众号

横云断岭的专栏

横云断岭

粉丝 44
博文 12
码字总数 13733
作品 3
深圳
私信 提问
加载中
请先登录后再评论。
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
7
高效 Java Web 开发框架--JessMA

JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC DAO 组件),集成了 Action 拦截...

伤神小怪兽
2012/11/13
9.2K
3
解析apk安装包的工具--apkutil

apkUtil是一个用来解析apk安装包的工具,通过它可以获取一个安装包的图标、程序名、所需android平台,权限等信息,并将其转换为java对象。该工具依赖于aapt工具,目前仅支持在windows平台上运...

貌似掉线
2012/11/18
5K
0
Clojure 模板引擎--mustache.clj

mustache.clj 是一个mustache模板的Clojure实现。 在开发Rssminer时,因需要一个更快更轻巧的模板库,而开发。 特点: 零依赖,小巧。包含源代码的jar仅16K 速度快。在i5机器上,一个测试中,...

fshen
2012/12/09
795
0
eternal mvc 框架--eternal

spring在设计上真博大精深啊,无论从哪点来说,都非常不错,当然啦大家一直说他的配置麻烦,这应该是人家的设计思想吧,把每个类都看成一个bean,以xml的方式配置关系,就像java的面向对象,...

青青小树
2013/01/09
1.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

这是对我最大的认可和鼓励

这是程序员cxuan的第18篇原创分享 可能一些小伙伴们不太清楚是怎么回事,是这样的。 我最近肝了三本 PDF,分别是 《Java核心技术总结》、《HTTP核心总结》、《程序员必知的硬核知识》、目录如...

osc_nc5ghpm9
6分钟前
0
0
折叠屏丨华为专家深度解读折叠屏连续性和拖拽适配介绍

折叠屏手机的出现,满足了用户对大屏幕的追求,但卓越的用户体验更离不开应用的适配与功能创新。距离Mate X面世已经一年的时间,应用适配情况如何?在适配过程中有哪些经验可以参考?有没有常...

软件绿色联盟
今天
0
0
一个 static 还能难得住我?

这是程序员cxuan的第15期原创分享 static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量、方法、做静态代码块、静态导包等,下面我们就来具体聊...

osc_p23q7y3z
8分钟前
0
0
高中生写LOL外挂1年狂赚500万,落网前刚买下120万保时捷...

点击“开发者技术前线”,选择“星标🔝” 在看|星标|留言, 真爱 来源:交汇点| 编辑:可可 2020年3月,泰州姜堰警方接到一起特殊的报警:一名游戏玩家向民警反映,自己在玩英雄联盟对战时输...

开发者技术前线
今天
0
0
一次简单的服务器 cpu 占用率高的快速排查实战

前两天,朋友遇到一个线上 cpu 占用率很高的问题,我们俩一起快速定位并解决了这个问题。在征求朋友同意后,特发此文分享整个过程。本文以对话的形式展开,加上我的内心独白。文中对话与实际...

osc_emo7t12i
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部