spring?boot?executable?jar/war?原理解析
spring boot executable jar/war
spring boot里其實不僅可以直接以 java -jar demo.jar的方式啟動,還可以把jar/war變?yōu)橐粋€可以執(zhí)行的腳本來啟動,比如./demo.jar。
把這個executable jar/war 鏈接到/etc/init.d下面,還可以變?yōu)閘inux下的一個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í)行的。更多詳細的內(nèi)容可以參考官方的文檔。
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment-install
zip格式里的magic number
生成的jar/war實際上是一個zip格式的文件,這個zip格式文件為什么可以在shell下面直接執(zhí)行?
研究了下zip文件的格式。zip文件是由entry組成的,而每一個entry開頭都有一個4個字節(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下面,可以把一個bash文件直接寫在一個zip文件的開頭,這樣子會被認為是一個bash script。 而zip處理軟件在讀取這個文件時,仍然可以正確地處理。
比如spring boot生成的executable jar/war,的開頭是:
#!/bin/bash # # . ____ _ __ _ _ # /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ # ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ # \\/ ___)| |_)| | | | | || (_| | ) ) ) ) # ' |____| .__|_| |_|_| |_\__, | / / / / # =========|_|==============|___/=/_/_/_/ # :: Spring Boot Startup Script :: #
在script內(nèi)容結尾,可以看到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則是由操作系統(tǒng)在啟動service的情況:
service demo start/stop/restart/status
所以fat jar可以直接在普通的命令行里執(zhí)行,./xxx.jar 或者link到/etc/init.d/下,變?yōu)橐粋€service。
總結
- jar/war實際就是zip格式
- spring-boot-maven-plugin把啟動腳本打到executable jar/war的最前面
- 腳本的最后一行是
exit 0,腳本只執(zhí)行自己的內(nèi)容,不會執(zhí)行到jar/war里的內(nèi)容 - zip文件由多個entry組成,entry的開頭有magic number,所以zip處理軟件可以跳過前面的腳本,準確找到zip entry
到此這篇關于spring boot executable jar/war 原理的文章就介紹到這了,更多相關spring boot executable內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot2.0以上調(diào)度器配置線程池的實現(xiàn)
這篇文章主要介紹了springboot2.0以上調(diào)度器配置線程池的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
mybatis框架xml下trim中的prefix與suffix等標簽的用法
這篇文章主要介紹了mybatis框架xml下trim中的prefix與suffix等標簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
獲取Java的MyBatis框架項目中的SqlSession的方法
SqlSession中包括已經(jīng)映射好的SQL語句,這樣對象實例就可以直接拿過來用了,那么這里就來講解獲取Java的MyBatis框架項目中的SqlSession的方法2016-06-06
在java中判斷兩個浮點型(float)數(shù)據(jù)是否相等的案例
這篇文章主要介紹了在java中判斷兩個浮點型(float)數(shù)據(jù)是否相等的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

