spring boot executable jar/war 原理解析
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的最前面部分。
这个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。
总结
- jar/war实际就是zip格式
- spring-boot-maven-plugin把启动脚本打到executable jar/war的最前面
- 脚本的最后一行是
exit 0
,脚本只执行自己的内容,不会执行到jar/war里的内容 - zip文件由多个entry组成,entry的开头有magic number,所以zip处理软件可以跳过前面的脚本,准确找到zip entry
到此这篇关于spring boot executable jar/war 原理的文章就介绍到这了,更多相关spring boot executable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
IDEA 2021.3 使用及idea2021.3.1激活使用方法
IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,今天通过本文给大家介绍idea2021.3.1激活及使用教程,感兴趣的朋友一起看看吧2022-01-01Java 异常java.lang.NoSuchFieldException解决方案
这篇文章主要介绍了Java 异常java.lang.NoSuchFieldException解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-10-10
最新评论