欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring?boot?executable?jar/war?原理解析

 更新時(shí)間:2023年02月06日 09:53:44   作者:橫云斷嶺  
spring boot里其實(shí)不僅可以直接以 java -jar demo.jar的方式啟動(dòng),還可以把jar/war變?yōu)橐粋€(gè)可以執(zhí)行的腳本來啟動(dòng),比如./demo.jar,這篇文章主要介紹了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的最前面部分。

https://github.com/spring-projects/spring-boot/blob/1ca9cdabf71f3f972a9c1fdbfe9a9f5fda561287/spring-boot-tools/spring-boot-loader-tools/src/main/resources/org/springframework/boot/loader/tools/launch.script

這個(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í)例

    java可變參數(shù)(不定向參數(shù))的作用與實(shí)例

    這篇文章主要給大家介紹了關(guān)于java可變參數(shù)(不定向參數(shù))的作用與實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • idea實(shí)現(xiàn)類快捷生成接口方法示例

    idea實(shí)現(xiàn)類快捷生成接口方法示例

    這篇文章主要介紹了idea實(shí)現(xiàn)類快捷生成接口方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java中stringBuilder的用法詳解

    java中stringBuilder的用法詳解

    這篇文章主要介紹了java中stringBuilder的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • IDEA?2021.3?使用及idea2021.3.1激活使用方法

    IDEA?2021.3?使用及idea2021.3.1激活使用方法

    IDEA?全稱?IntelliJ?IDEA,是java語言開發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認(rèn)為最好的java開發(fā)工具之一,今天通過本文給大家介紹idea2021.3.1激活及使用教程,感興趣的朋友一起看看吧
    2022-01-01
  • SpringBoot集成Kafka的步驟

    SpringBoot集成Kafka的步驟

    這篇文章主要介紹了SpringBoot集成Kafka的步驟,幫助大家更好的理解和使用SpringBoot,感興趣的朋友可以了解下
    2021-01-01
  • 查看Spring容器中bean的五種方法小結(jié)

    查看Spring容器中bean的五種方法小結(jié)

    近期在寫Spring項(xiàng)目的時(shí)候,需要通過注解的形式去替代之前直接將Bean存放在Spring容器這種方式,以此來簡(jiǎn)化對(duì)于Bean對(duì)象的操作,這篇文章主要給大家介紹了關(guān)于如何查看Spring容器中bean的五種方法,需要的朋友可以參考下
    2024-05-05
  • Java 異常java.lang.NoSuchFieldException解決方案

    Java 異常java.lang.NoSuchFieldException解決方案

    這篇文章主要介紹了Java 異常java.lang.NoSuchFieldException解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • jsoup?框架的使用小結(jié)

    jsoup?框架的使用小結(jié)

    jsoup 是一款基于Java的HTML解析器,它提供了一套非常省力的API,不但能直接解析某個(gè)URL地址、HTML文本內(nèi)容,而且還能通過類似于 DOM、CSS 或者jQuery的方法來操作數(shù)據(jù),所以jsoup也可以被當(dāng)做爬蟲工具使用,這篇文章主要介紹了jsoup使用,需要的朋友可以參考下
    2023-04-04
  • JavaWeb實(shí)現(xiàn)壓縮多個(gè)文件并下載實(shí)例詳解

    JavaWeb實(shí)現(xiàn)壓縮多個(gè)文件并下載實(shí)例詳解

    本文通過實(shí)例代碼給大家講解了javaweb實(shí)現(xiàn)壓縮多個(gè)文件并下載功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-07-07
  • Java實(shí)現(xiàn)天天酷跑小游戲完整代碼(附源碼)

    Java實(shí)現(xiàn)天天酷跑小游戲完整代碼(附源碼)

    這篇文章主要介紹了使用Java實(shí)現(xiàn)天天酷跑(附源碼),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論