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_www.thd540.com format)
  
  zip处理软件是读取到magic number才开始处理。所以在linux/unix下面,可以把一个bash文件直接写在一个zip文件的开头,这样子会被认为是一个bash script。 而zip处理软件在读取这个文件时,仍然可以正确地处理。
  
  比如spring boot生成的executable www.michenggw.com 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可以直接在普通的命令行里执行,.www.yigouyule2.cn /xxx.jar 或者link到/etc/init.d/下,变为一个service。
  
  总结
  
  jar/war实际就是zip格式
  
  spring-boot-maven-www.furggw.com plugin把启动脚本打到executable jar/war的最前面
  
  脚本的最后一行是exit 0,脚本只执行自己的内容,不会执行到jar/war里的内容
  
  zip文件由多个entry组成,entry的开头有magic number,所以zip处理软件可以跳过前面的脚本,准确找到zip entry

Spring Boot Executable jar/war 原理的更多相关文章

  1. spring boot将jar包转换成war包发布

    spring boot将jar包转换成war包发布步骤 将<packaging>jar</packaging>修改为<packaging>war</packa ...

  2. Spring Boot由jar包转成war包

    Spring Boot由jar包转成war包 spring boot 默认是以jar包形式启动web程序,在新建spring boot项目时候可以选择war包的启动方式. 建议在开发的时候建立以jar ...

  3. spring boot打包成war包的页面该放到哪里?

    背景 经常有朋友问我,平时都是使用spring mvc,打包成war包发布到tomcat上,如何快速到切换到spring boot的war或者jar包上? 先来看看传统的war包样式是什么样子的? 1 ...

  4. Spring boot 打成jar包问题总结

    Spring boot 打成jar包问题总结 1.Unable to find a single main class from the following candidates 1.1.问题描述 m ...

  5. Spring Boot 项目打成 war 包部署

    Spring Boot 一个非常方便的功能就是支持内置的 Servlet 容器,一般我们部署 Spring Boot 应用时都是打成一个可执行的 Jar 包进行部署.其实 Spring Boot 也是 ...

  6. spring boot插件开发实战和原理

    本文转载自spring boot插件开发实战和原理 实战:编写spring boot插件 为什么要编写boot插件 因为我们在开发的时候需要提供一些共同的功能,所以我们编写个共同的jar包.开发人员在 ...

  7. Spring Boot的自动配置原理及启动流程源码分析

    概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...

  8. Spring Boot 文件上传原理

    首先我们要知道什么是Spring Boot,这里简单说一下,Spring Boot可以看作是一个框架中的框架--->集成了各种框架,像security.jpa.data.cloud等等,它无须关 ...

  9. Spring Boot 发布 jar 包转为 war 包秘籍。

    Spring Boot是支持发布jar包和war的,但它推荐的是使用jar形式发布.使用jar包比较方便,但如果是频繁修改更新的项目,需要打补丁包,那这么大的jar包上传都是问题.所以,jar包不一定 ...

随机推荐

  1. 总结ing

    1,iOS的GCD中如何关闭或者杀死一个还没执行完的后台线程? 举例来说,我通过导航进入到了一个视图,这个视图加载的时候会新建一个线程在后台运行,假设这个线程需要从网络中读取许多数据,需要一定的时间, ...

  2. C# 委托知识总结【转】

    1.什么是委托,为什么要使用委托 我正在埋头苦写程序,突然想喝水,但是又不想自己去掉杯水而打断自己的思路,于是我就想让女朋友去给我倒水.她去给我倒水,首先我得让她知道我想让她干什么,通知她之后我可以继 ...

  3. lnmp安装后,phpmyadmin空白

    使用lnmp 一键安装后,运行phpinfo是没有问题的,说明php没有问题,但是运行phpmyadmin确实一片空白,网上说的解决方案有几种: 1.config.inc.php增加一个配置$cfg[ ...

  4. 【赛时总结】◇赛时·VI◇ Atcoder ABC-104

    ◇赛时·VI◇ ABC-104 ◆??? 莫名爆炸……ABC都AK不了 QwQ C题竟然沦落到卡数据的地步:D题没有思路,直接放弃 ⋋( ◕ ∧ ◕ )⋌ ◆ 题目&解析 ◇A题◇ Rated ...

  5. cncert阅读报告

    信息安全阅读报告 Problem 1: 国家计算机网络应急技术处理协调中心(简称“国家互联网应急中心”,英文缩写为“CNCERT”或“CNCERT/CC”)作为我国非政府层面网络安全应急体系核心技术协 ...

  6. docker镜像文件导入与导出 , 支持批量

    1. 查看镜像id sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/calico/node v1.0.1 c70511a ...

  7. 轻量级自动化工具 pssh

    pssh应用场景 pssh是一个用python编写的可以并发在多台服务器上批量执行命令的工具,它支持文件并行复制,远程并行执行命令,其中文件并行复制是pssh的核心功能,也是同类工具中的一个亮点. 要 ...

  8. 详解MessageBox(),MsgBox函数的正确使用

    //或者使用chr(13),chr(10)效果一样 MsgBox "a"&chr(13)&"b"&chr(10)&"c ...

  9. 统计寄存器AX中1 的个数

    ;==================================== ; 统计寄存器AX中1 的个数 DATAS segment DATAS ends CODES segment START: ...

  10. OracleWeblogic12C安装教程

    一,安装WebLogic Server 1. 双击exe安装文件 2.准备安装文件 3. 生成向导序列 4. 选择安装路径 5. 开始安装 经过以上步骤,weblogic已经成功安装到了你的电脑上,但 ...