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 以 jar 包方式运行在后台

Spring-boot jar 包方式启动: 首先,为了防止和常用的 Tomcat 8080 端口冲突,将 Spring-boot 项目的端口号设置为 9090。 具体方法:在 applicati...
  • lw_power
  • lw_power
  • 2016年01月10日 20:40
  • 30382

spring boot 打包成jar 包在发布到服务器上

spring boot 打包成jar 包在发布到服务器上,整个流程都是本人亲自实测,应该没有问题。...

Spring Boot Maven 打包可执行Jar文件!

Maven pom.xml 必须包含 jar org.springframework.boot spring-boot-maven-plugin ...

Spring Boot 入门

Spring Boot入门Spring Boot是Spring社区较新的一个项目。该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验,让...
  • isea533
  • isea533
  • 2015年12月27日 15:41
  • 187258

springboot打包成可执行Jar文件教程

我们在开发springboot项目时,通常都是在IDE环境里执行main函数启动应用,但是当我们开发完毕需要部署项目时,就需要把项目工程打成能够独立运行的jar文件。 把工程项目打成可执行的jar文...

SpringBoot项目打包三方JAR

SpringBoot项目打包成可运行JAR包,但是不是所有JAR包都是MAVEN中央库或者是私有库里面有的,那么要如何把第三方的JAR包通过MAVEN的SpringBoot的打包组件打包进可运行JAR...
  • doegoo
  • doegoo
  • 2017年07月25日 10:39
  • 1212

将 Spring boot jar包发布成服务

将 Spring boot jar包发布成服务

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

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

spring boot 原理、demo 与打包运行

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

springboot打包jar ,war遇到的问题。

springboot  server.port=80 server.servlet-path=/ 原有packaging为 jar模式,导出jar包,js页面需要需要去掉controller...
  • yuhxuan
  • yuhxuan
  • 2016年09月08日 17:10
  • 361
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring boot executable jar/war 原理
举报原因:
原因补充:

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