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的最前面部分。

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可以直接在普通的命令行裏執行,./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

公衆號

橫雲斷嶺的專欄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章