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. Python——合集

    合集 主要功能是对比列表中的信息,进行关系测试. 特点:1. 去重,把一个列表变成合集,就自动去重了.2. 关系测试,测试两组数据之间的交集.差集.并集等关系.3. 没有插入功能,只能添加.4. 一个 ...

  2. Python学习之购物车

    实现功能: 程序启动,提示用户输入用户名和密码,程序读取余额文件last_salary.txt内容(文件不存在则自动创建),若文件内容为空则提示“首次登录,请输入工资”: 用户可以输入商品编号进行购买 ...

  3. linux上面安装svn步骤

    一.安装 使用yum,非常简单 yum install subversion 二.配置 2.1.创建仓库 我们这里在/home下建立一个名为svn的仓库(repository),以后所有代码都放在这个 ...

  4. MYSQL SQL高级查询技巧

    1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...

  5. emplace_back

    c++11 的 list deque 和 vector 增加了emplace_back函数,相对于push_back函数,它减少了一次类的构造,因此效率更高,推荐使用. #include <li ...

  6. c++ 计算器 带括号 代码实现

    我用了两个栈 一个用来存数字 一个用来存运算符 这里引入优先度的概念便于理解 不同的运算符有不同的优先度 当优先度高的符号进入栈中 所有比它优先度低的符号都要弹出 对 就是这么霸道 ( 没有优先度 没 ...

  7. POJ:1995-Raising Modulo Numbers(快速幂)

    Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9512 Accepted: 578 ...

  8. 大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

    上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析Demo”啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货 ...

  9. struts2官方 中文教程 系列五:处理表单

    先贴个本帖的地址,免得其它网站被爬去了struts2教程 官方系列五:处理表单  即 http://www.cnblogs.com/linghaoxinpian/p/6906298.html 下载本章 ...

  10. Android onConfigurationChanged 收不到回调

    我返现,90度横屏 旋转到270度横屏onConfigurationChanged 是收不到回掉的.尽管清单里面声明了什么: android:configChanges="orientati ...