最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring-boot-thin-launcher插件分離jar包的依賴和配置方式

 更新時(shí)間:2023年09月01日 10:09:39   作者:david'fantasy  
這篇文章主要介紹了spring-boot-thin-launcher插件分離jar包的依賴和配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring-boot-thin-launcher插件分離jar包的依賴和配置

Spring Boot項(xiàng)目可以通過spring-boot-maven-plugin插件打包生成一個(gè)可執(zhí)行的jar包,這樣可以脫離web容器(例如tomcat)直接運(yùn)行。

但默認(rèn)情況下spring-boot-maven-plugin打出來的包是一個(gè)fat jar,即將所有的依賴全部打進(jìn)了jar包當(dāng)中,這樣的jar包體積很大,每次更新系統(tǒng)的時(shí)候都需要完整替換整個(gè)jar包(本地還好,如果是云服務(wù)器,網(wǎng)速慢了每次上傳文件都想砸電腦π__π)。

此外,系統(tǒng)切換環(huán)境時(shí),也同時(shí)需要切換配置參數(shù),雖然可以使用配置中心或者利用命令行參數(shù)修改配置,但有時(shí)候也免不了直接需要修改配置文件,這樣的話就有必要將配置文件從jar包中分離出來,單獨(dú)存放。

Spring社區(qū)大概也考慮到了部分開發(fā)者有這樣的需求,所以提供了spring-boot-thin-launcher這個(gè)插件用來將項(xiàng)目的依賴和配置從jar包中分離出去。

這個(gè)插件雖然是放到spring-projects-experimental(意思就是實(shí)驗(yàn)性質(zhì)的項(xiàng)目)當(dāng)中的,但從我使用的經(jīng)驗(yàn)來看應(yīng)該是比較穩(wěn)定的,能夠滿足絕大部分場(chǎng)景的需求。

廢話少說,還是先上代碼吧

<build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <!--項(xiàng)目的執(zhí)行入口-->
                    <mainClass>com.example.Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework.boot.experimental</groupId>
                        <artifactId>spring-boot-thin-layout</artifactId>
                        <version>1.0.12.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot.experimental</groupId>
                <artifactId>spring-boot-thin-maven-plugin</artifactId>
                <version>1.0.12.RELEASE</version>
                <executions>
                    <execution>
                        <!--在編譯時(shí)下載依賴包 -->
                        <id>resolve</id>
                        <goals>
                            <goal>resolve</goal>
                        </goals>
                        <inherited>false</inherited>
                    </execution>
                </executions>
            </plugin>
            <!--移動(dòng)配置文件到外部文件夾-->
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <move file="${project.build.directory}/classes/application.yml" todir="${project.build.directory}/thin/root/config"/>
                                <copy todir="${project.build.directory}/thin/root/">
                                    <fileset dir="${basedir}/bin"/>
                                </copy>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

在maven-antrun-plugin中可以根據(jù)需要定義一些額外的任務(wù),比如移動(dòng)其它的配置文件,或者將外部的一些文件加入到項(xiàng)目目錄中(比如執(zhí)行腳本等)。

這樣配置后,

打包以后的target目錄大概是這樣的

target目錄結(jié)構(gòu).png

其中thin目錄下面就可以作為整個(gè)項(xiàng)目的部署目錄了,config是配置文件的存放目錄,respository下面是所有的依賴包,backend-2.0.jar中僅包含了項(xiàng)目自身的資源,體積比之前小太多了。

##運(yùn)行原理那為什么執(zhí)行時(shí),系統(tǒng)知道自動(dòng)去外部加載依賴和配置呢?

這個(gè)問題需要首先了解打包后的結(jié)構(gòu),把backend-2.0.jar解壓之后,會(huì)發(fā)現(xiàn)除了我們自己的類和資源以外,還多了一個(gè)類:org.springframework.boot.loader.wrapper.ThinJarWrapper,其實(shí)我們?cè)谶\(yùn)行項(xiàng)目時(shí),這個(gè)類才是真正的項(xiàng)目入口,它會(huì)在默認(rèn)位置查找項(xiàng)目相關(guān)的依賴,如果沒有找到,甚至還會(huì)從指定的maven倉庫中直接下載,所以啟動(dòng)時(shí)系統(tǒng)能夠識(shí)別到外部的依賴包。

至于外部配置,是因?yàn)镾pring Boot框架在讀取配置文件時(shí),會(huì)默認(rèn)讀取幾個(gè)目錄下的配置文件,其中優(yōu)先級(jí)最高的就是當(dāng)前目錄下的config目錄(所以config目錄的名字不能改成其它的)。

執(zhí)行jar包的時(shí)候需要注意,要額外添加一個(gè)參數(shù)來指定依賴包所在的倉庫位置(在我們的配置中就在jar包的當(dāng)前文件夾)

例如:-Dthin.root=. 默認(rèn)的位置是${user.home}/.m2,如果倉庫中沒有需要的依賴,啟動(dòng)jar包時(shí)還會(huì)自動(dòng)連接遠(yuǎn)程倉庫進(jìn)行下載,導(dǎo)致啟動(dòng)時(shí)間非常長,這一點(diǎn)需要注意。

spring-boot-thin-launcher還有很多可配置的參數(shù),具體可以到 官網(wǎng) 上自行查看。

附上一個(gè)通用的spring-boot-thin-launcher打包文件的啟動(dòng)腳本

#!/bin/bash
#這里指定需要運(yùn)行的jar包的名字
APP_NAME="your-jar-name.jar"
JVM_ARGS="-Xms512M -Xmx2048M -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/log/heap.hprof"
THIN_ARGS="-Dthin.root=. -Dthin.offline=true"
#使用說明,用來提示輸入?yún)?shù)
usage() {
    echo "Usage: sh 執(zhí)行腳本.sh [start|stop|restart|status|run]"
    exit 1
}
#檢查程序是否在運(yùn)行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}
#后臺(tái)啟動(dòng)
start(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is already running. pid=${pid} ."
  else
    echo "${APP_NAME} running with args: nohup java $THIN_ARGS -jar $JVM_ARGS $APP_NAME "
    nohup java $THIN_ARGS -jar $JVM_ARGS $APP_NAME >> catalina.out 2>&1 &
  fi
}
#前臺(tái)啟動(dòng)
run(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is already running. pid=${pid} ."
  else
    echo "${APP_NAME} running with args: java $THIN_ARGS -jar $JVM_ARGS $APP_NAME"
    java $THIN_ARGS -jar $JVM_ARGS $APP_NAME 
  fi
}
#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
  else
    echo "${APP_NAME} is not running"
  fi
}
#輸出運(yùn)行狀態(tài)
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}
#重啟
restart(){
  stop
  start
}
#根據(jù)輸入?yún)?shù),選擇執(zhí)行對(duì)應(yīng)方法,不輸入則執(zhí)行使用說明
case "$1" in
  "start")
    start
    ;;
  "run")
    run
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot集成Serverless的實(shí)現(xiàn)示例

    SpringBoot集成Serverless的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot集成Serverless的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • SpringBoot自定義Starter實(shí)現(xiàn)流程詳解

    SpringBoot自定義Starter實(shí)現(xiàn)流程詳解

    SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動(dòng)掃描到要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾
    2022-09-09
  • Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解

    Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解

    這篇文章主要介紹了Java編程實(shí)現(xiàn)非對(duì)稱加密的方法,簡單講述了非對(duì)稱加密的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)DH加密解密、RSA加密解密、ElGamal加密等具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • 使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的示例代碼

    使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的示例代碼

    這篇文章主要介紹了使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringCloud之Ribbon使用示例解析

    SpringCloud之Ribbon使用示例解析

    這篇文章主要為大家介紹了SpringCloud之Ribbon使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解

    AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解

    這篇文章主要為大家介紹了AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Springboot Controller接口默認(rèn)自動(dòng)填充業(yè)務(wù)實(shí)體參數(shù)值詳解

    Springboot Controller接口默認(rèn)自動(dòng)填充業(yè)務(wù)實(shí)體參數(shù)值詳解

    這篇文章主要介紹了Springboot Controller接口默認(rèn)自動(dòng)填充業(yè)務(wù)實(shí)體參數(shù)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • JDBC獲取數(shù)據(jù)庫連接由淺入深

    JDBC獲取數(shù)據(jù)庫連接由淺入深

    大家好,本篇文章主要講的是JDBC獲取數(shù)據(jù)庫連接由淺入深,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • SpringBoot整合ShedLock解決定時(shí)任務(wù)防止重復(fù)執(zhí)行的問題

    SpringBoot整合ShedLock解決定時(shí)任務(wù)防止重復(fù)執(zhí)行的問題

    ShedLock是一個(gè)用于分布式系統(tǒng)中防止定時(shí)任務(wù)重復(fù)執(zhí)行的庫,本文主要介紹了SpringBoot整合ShedLock解決定時(shí)任務(wù)防止重復(fù)執(zhí)行的問題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • 利用java讀取web項(xiàng)目中json文件為map集合方法示例

    利用java讀取web項(xiàng)目中json文件為map集合方法示例

    這篇文章主要給大家介紹了關(guān)于利用java讀取web項(xiàng)目中json文件為map集合的相關(guān)資料,文中通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-08-08

最新評(píng)論

昆山市| 中山市| 金沙县| 克什克腾旗| 汝南县| 东光县| 赣州市| 交城县| 武义县| 武义县| 延边| 佛冈县| 红河县| 交城县| 定远县| 师宗县| 齐河县| 海晏县| 高邮市| 阜南县| 南宫市| 车致| 日照市| 五指山市| 临安市| 和林格尔县| 平昌县| 小金县| 龙井市| 廉江市| 青龙| 朝阳市| 大足县| 上饶市| 绥芬河市| 潞城市| 玉树县| 内黄县| 克山县| 昭苏县| 洛川县|