spring?boot?executable?jar/war?原理解析
spring boot executable jar/war
spring boot里其實(shí)不僅可以直接以 java -jar demo.jar
的方式啟動(dòng),還可以把jar/war變?yōu)橐粋€(gè)可以執(zhí)行的腳本來啟動(dòng),比如./demo.jar
。
把這個(gè)executable jar/war 鏈接到/etc/init.d
下面,還可以變?yōu)閘inux下的一個(gè)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就是可執(zhí)行的。更多詳細(xì)的內(nèi)容可以參考官方的文檔。
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment-install
zip格式里的magic number
生成的jar/war實(shí)際上是一個(gè)zip格式的文件,這個(gè)zip格式文件為什么可以在shell下面直接執(zhí)行?
研究了下zip文件的格式。zip文件是由entry組成的,而每一個(gè)entry開頭都有一個(gè)4個(gè)字節(jié)的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下面,可以把一個(gè)bash文件直接寫在一個(gè)zip文件的開頭,這樣子會(huì)被認(rèn)為是一個(gè)bash script。 而zip處理軟件在讀取這個(gè)文件時(shí),仍然可以正確地處理。
比如spring boot生成的executable jar/war,的開頭是:
#!/bin/bash # # . ____ _ __ _ _ # /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ # ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ # \\/ ___)| |_)| | | | | || (_| | ) ) ) ) # ' |____| .__|_| |_|_| |_\__, | / / / / # =========|_|==============|___/=/_/_/_/ # :: Spring Boot Startup Script :: #
在script內(nèi)容結(jié)尾,可以看到zip entry的magic number:
exit 0 PK^C^D
spring boot的launch.script
實(shí)際上spring boot maven plugin是把下面這個(gè)script打包到fat jar的最前面部分。
這個(gè)launch.script 支持很多變量設(shè)置。還可以自動(dòng)識(shí)別是處于auto
還是service
不同mode中。
所謂的auto mode
就是指直接運(yùn)行jar/war:
./demo.jar
而service mode
則是由操作系統(tǒng)在啟動(dòng)service的情況:
service demo start/stop/restart/status
所以fat jar可以直接在普通的命令行里執(zhí)行,./xxx.jar
或者link到/etc/init.d/
下,變?yōu)橐粋€(gè)service。
總結(jié)
- jar/war實(shí)際就是zip格式
- spring-boot-maven-plugin把啟動(dòng)腳本打到executable jar/war的最前面
- 腳本的最后一行是
exit 0
,腳本只執(zhí)行自己的內(nèi)容,不會(huì)執(zhí)行到j(luò)ar/war里的內(nèi)容 - zip文件由多個(gè)entry組成,entry的開頭有magic number,所以zip處理軟件可以跳過前面的腳本,準(zhǔn)確找到zip entry
到此這篇關(guān)于spring boot executable jar/war 原理的文章就介紹到這了,更多相關(guān)spring boot executable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java可變參數(shù)(不定向參數(shù))的作用與實(shí)例
這篇文章主要給大家介紹了關(guān)于java可變參數(shù)(不定向參數(shù))的作用與實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04IDEA?2021.3?使用及idea2021.3.1激活使用方法
IDEA?全稱?IntelliJ?IDEA,是java語言開發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認(rèn)為最好的java開發(fā)工具之一,今天通過本文給大家介紹idea2021.3.1激活及使用教程,感興趣的朋友一起看看吧2022-01-01Java 異常java.lang.NoSuchFieldException解決方案
這篇文章主要介紹了Java 異常java.lang.NoSuchFieldException解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10JavaWeb實(shí)現(xiàn)壓縮多個(gè)文件并下載實(shí)例詳解
本文通過實(shí)例代碼給大家講解了javaweb實(shí)現(xiàn)壓縮多個(gè)文件并下載功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-07-07Java實(shí)現(xiàn)天天酷跑小游戲完整代碼(附源碼)
這篇文章主要介紹了使用Java實(shí)現(xiàn)天天酷跑(附源碼),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12