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

最新文章

  1. 《机电传动控制》PLC仿真
  2. 数据字典生成工具之旅(4):NPOI操作EXECL
  3. FTP 的搭建过程和遇到的问题
  4. java框架篇---spring aop两种配置方式
  5. (原+转)C++中的const修饰符
  6. 内存排查 valgrind
  7. 响应的系统设置的事件——重写onConfigurationChanged响应系统设置更改
  8. Spring Boot1.5.4 AOP实例
  9. 如何正确的理解和解决 ORA-01843:not a valid month
  10. 一句python代码搭建FTP服务
  11. Python后台开发Django(数据库)
  12. SQL Server Report Server 报表用户权限T-SQL查询
  13. 【javascript】数据类型中的一些小知识点
  14. 新买苹果电脑,mac系统中小白应该了解哪些东西?
  15. 【自适应波束形成】MVDR(Minimum Variance Distortionless Response )笔记
  16. angular7 DOM操作 及 @ViewChild
  17. 走进JDK(五)------AbstractList
  18. 基于Web Service的客户端框架搭建一:C#使用Http Post方式传递Json数据字符串调用Web Service
  19. delphi 线程的应用 和spcomm的应用
  20. ORACLE的init.ora配置文件中参数详解

热门文章

  1. 如何把设计图自动转换为iOS代码? 在线等,挺急的!
  2. 访问远程mysql数据库,出现报错,显示“1130 - Host&#39;xxx.xxx.xxx.xxx&#39; is not allowed to connect to this MySQL server“
  3. PHP脚本执行效率性能检测之WebGrind的使用
  4. 图解HTTP总结(5)——与HTTP协作的Web服务器
  5. js for 循环中有异步函数时,回调函数总是最后一步的值。
  6. 线程、进程、协程和GIL(三)
  7. python 函数的嵌套 和 作用域链
  8. [Codeforces976E]Well played!(贪心)
  9. [CodeForces238E]Meeting Her(图论+记忆化搜索)
  10. Balance POJ - 1837