spring boot executable jar/war 原理

原创 2016年04月03日 14:24:11

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。

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring-boot-maven-plugin 插件的作用

OM 文件中添加了“org.springframework.boot:spring-boot-maven-plugin”插件。在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一...
  • hotdust
  • hotdust
  • 2016年05月14日 11:38
  • 36862

VIII. Spring Boot Maven插件

构建工具插件Spring Boot为Maven和Gradle提供构建工具插件。该插件提供各种各样的特性,包括打包可执行jars。本节提供关于插件的更多详情及用于扩展一个不支持的构建系统所需的帮助信息。...
  • zhf257
  • zhf257
  • 2017年01月05日 00:21
  • 4282

将Springboot的“fat jar” 变成 “thin jar”

大家都知道spring boot有个很吸引人的特性,那就是可以直接把应用打包成为一个jar/war,而且这个jar/war是可以直接启动的,称之为“fat jar”。但是有时候我们有这样的需求: 1....
  • timedifier2
  • timedifier2
  • 2016年12月29日 11:45
  • 1630

spring boot 原理、demo 与打包运行

Spring  Boot的背景,我们为什么要用它,它能给我们带来什么遍便利?         回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相...
  • u012373815
  • u012373815
  • 2016年03月07日 17:59
  • 10717

FatJar减肥: 解决SpringBoot jar包太大的问题

spring boot添加spring-boot-maven-plugin插件后, 打出来的Jar动辄几十上百兆. 这种FatJar包在传输时会相当不便, 尤其是某些外企, 服务器可能在美国, 上传速...
  • shunhua19881987
  • shunhua19881987
  • 2017年10月27日 16:13
  • 735

应用内置embeded tomcat,并打包为fat jar的解决方案

需求大量的微服务框架引起了一大波embeded tomcat,executable fat jar的潮流。显然spring boot是最出色的解决方案,但是spring boot有两个不足的地方: 不...
  • hengyunabc
  • hengyunabc
  • 2016年04月05日 23:49
  • 4169

Spring Boot打包可执行的jar或者war文件

首先pom文件中包含有spring-boot-maven-plugin:
  • sinat_36246371
  • sinat_36246371
  • 2017年03月29日 13:57
  • 3331

Spring Boot热部署之springloader

热部署是什么呢?热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。...
  • googleoyyp
  • googleoyyp
  • 2017年03月07日 00:00
  • 1378

Spring boot 两种热部署方式 springloader 和 devtools

什么是热部署? 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。在平时编写代码的时候,你会发现我们只是简单把打印信息改变了,就需要重新部署,如果要改变这样的方式,就需要用到热部署spr...
  • a78270528
  • a78270528
  • 2017年08月25日 18:05
  • 939

Spring Boot热部署(springloader)

spring boot热部署1、配置热部署环境,主要是在pom.xml配置文件里面加入以下代码: org.springframewo...
  • laozhuxiao
  • laozhuxiao
  • 2017年05月27日 13:52
  • 387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring boot executable jar/war 原理
举报原因:
原因补充:

(最多只允许输入30个字)