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

SpringBoot加載外部依賴過程解析

 更新時(shí)間:2020年01月11日 10:19:34   作者:a-du  
這篇文章主要介紹了SpringBoot加載外部依賴過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了SpringBoot加載外部依賴過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

背景

公司一個(gè)項(xiàng)目的大數(shù)據(jù)平臺(tái)進(jìn)行改造,之前使用Structured Streaming作為實(shí)時(shí)計(jì)算框架,需要替換為替換為Kafka Streams,并使用SpringBoot包裝,使其可以納入微服務(wù)體系。

然而由于之前并沒有接觸過SpringFramework相關(guān)技術(shù),并且項(xiàng)目工期較為緊張,因此只好花了2天時(shí)間看了看Spring和SpringBoot,并且在改造過程中沿用大部分原有代碼,最后套上SpringBoot的殼子(就是基本不使用Spring Data相關(guān)的封裝和DI、AOP這些特性,只是在啟動(dòng)類上添加@SpringBootApplication注解,并在main()方法里面使用SpringApplication.run()方式啟動(dòng))。

問題

然后在部署過程中就遇到了一個(gè)比較蛋疼的問題:因?yàn)檫z留代碼的關(guān)系,部分配置項(xiàng)的名稱是自定義的,并使用java.util.ResourceBundle的getString()來讀取,而為了讓項(xiàng)目可以注冊(cè)到Eureka以及使用SpringBoot默認(rèn)的日志配置,在配置文件中配置了eureka.client.serviceUrl.defaultZone以及l(fā)ogging.file等SpringBoot內(nèi)置的配置項(xiàng),并使用SpringBoot內(nèi)置的配置讀取方式讀取。

也就是在一個(gè)應(yīng)用程序中,混合使用了兩種讀取配置文件的方式。在使用maven將應(yīng)用程序“EatMalonPeople”打包后,根據(jù)微服務(wù)組大佬的友情提示,使用如下命令運(yùn)行程序:

java -jar EatMalonPeople.jar

然鵝運(yùn)行倒是沒問題,不過application.properties文件在jar包里面,修改配置文件需要用vim直接修改jar包。感覺這種方式略挫,不太能接受。按照以往的經(jīng)驗(yàn),使用java -cp命令可以指定classpath,應(yīng)用程序會(huì)優(yōu)先讀取classpath指定的外部配置文件。但是當(dāng)我在config目錄下拷貝了一份application.properties文件,并修改了其中使用ResourceBundle.getString()方式讀取的配置項(xiàng)時(shí),再使用:

java -cp .:./config/application.properties EatMalonPeople.jar

啟動(dòng)后,發(fā)現(xiàn)生效的配置項(xiàng)仍然是EatMalonPeople.jar這個(gè)jar包內(nèi)的配置項(xiàng)......
感覺不太科學(xué)啊。于是去查了查SpringBoot項(xiàng)目加載配置文件的順序,結(jié)果根據(jù)Spring官網(wǎng)的提示,SpringBoot加載配置文件application.properties的順序依次為:

  • 當(dāng)前目錄的cofnig目錄
  • 當(dāng)前目錄
  • classpath目錄下的/config目錄
  • classpath目錄

但是根據(jù)這種順序,明明應(yīng)該加載config目錄下的配置文件嘛。于是在pom文件中exclude掉了配置文件:

<resources>
  <resource>
    <directory>src/main/resources</directory>
      <excludes>
        <exclude>${resource.exclude}</exclude>
      </excludes>
  </resource>
</resources>

這樣jar包內(nèi)就不含有配置文件了。再次使用

java -cp .:./config/application.properties EatMalonPeople.jar

啟動(dòng)后,應(yīng)用程序能注冊(cè)到Eureka,然而使用ResourceBundle.getString()方法獲取的配置項(xiàng)竟然找不到了,直接throw出了內(nèi)部封裝的找不到配置項(xiàng)錯(cuò)誤!

天啦嚕,這是要鬧哪樣嘛。原來SpringBoot讀取配置文件的順序只能保證內(nèi)部方式可以讀到,也就是說對(duì)于SpringBoot的jar包,-cp命令是沒有用的撒。沒想到我這個(gè)剛學(xué)過兩天Spring的萌新竟然碰到了這種問題,真是不給活路啊。

解決

又是一頓好找,終于在官網(wǎng)的另一處發(fā)現(xiàn)了原因。

原來SpringBoot是通過org.springframework.boot.loader.Launcher類來啟動(dòng)的,這貨才是jar包中META-INF/MANIFEST.MF文件中Main-Class這個(gè)屬性的值,Launcher最后會(huì)調(diào)用我們自定義啟動(dòng)類中的的main()方法(而我們自定義的啟動(dòng)類是META-INF/MANIFEST.MF文件中的Start-Class屬性的值,這個(gè)屬性應(yīng)該是SpringBoot特有的)。

這個(gè)類有三個(gè)子類,分別是JarLauncher,WarLauncher,PropertiesLauncher,前兩個(gè)Launcher都是不能添加外部依賴的。只有PropertiesLauncher是可以的。于是在spring-boot-maven-plugin中添加layout屬性,添加后的spring-boot-maven-plugin的配置是醬嬸兒的:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <layout>ZIP</layout>
  </configuration>
</plugin>

然后用maven重新打包,并且在運(yùn)行時(shí)使用loader.path參數(shù)指定外部classpath地址:

java -Dloader.path=./config -jar EatMalonPeople.jar

這樣SpringBoot應(yīng)用程序就可以使用兩種方式愉快的讀取外部配置文件啦(其實(shí)還有外部jar,也是可以的)!

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)作業(yè)調(diào)度的示例代碼

    Java實(shí)現(xiàn)作業(yè)調(diào)度的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)SJF算法調(diào)度,要求測試數(shù)據(jù)可以隨即輸入或從文件中讀入,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-04-04
  • SpringBoot中定制異常頁面的實(shí)現(xiàn)方法

    SpringBoot中定制異常頁面的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot中定制異常頁面的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Spring與Mybatis的整合方法(基于Eclipse的搭建)

    詳解Spring與Mybatis的整合方法(基于Eclipse的搭建)

    這篇文章主要介紹了Spring與Mybatis的整合方法(基于Eclipse的搭建),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 徹底搞懂Java多線程(五)

    徹底搞懂Java多線程(五)

    這篇文章主要給大家介紹了關(guān)于Java面試題之多線程和高并發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Springboot前后端分離項(xiàng)目配置跨域?qū)崿F(xiàn)過程解析

    Springboot前后端分離項(xiàng)目配置跨域?qū)崿F(xiàn)過程解析

    這篇文章主要介紹了Springboot前后端分離項(xiàng)目配置跨域?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • JavaScript 與 Java 區(qū)別介紹  學(xué)java怎么樣

    JavaScript 與 Java 區(qū)別介紹 學(xué)java怎么樣

    JavaScript 是一種嵌入式腳本文件,直接插入網(wǎng)頁,有瀏覽器一邊解釋一邊執(zhí)行。而java 語言不一樣,他必須在JAVA虛擬機(jī)上運(yùn)行。而且事先需要進(jìn)行編譯。接下來腳本之家小編給大家揭曉js與java區(qū)別,感興趣的朋友一起看看吧
    2016-09-09
  • springMVC中基于token防止表單重復(fù)提交方法

    springMVC中基于token防止表單重復(fù)提交方法

    本篇文章主要介紹了springMVC中基于token防止表單重復(fù)提交方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù)的步驟詳解

    SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù)的步驟詳解

    XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級(jí)、易擴(kuò)展,現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用,本文給大家介紹了SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù),需要的朋友可以參考下
    2023-10-10
  • SpringMVC如何配置JSP視圖解析器

    SpringMVC如何配置JSP視圖解析器

    這篇文章主要介紹了SpringMVC如何配置JSP視圖解析器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java基于Socket做一個(gè)簡單下載器

    java基于Socket做一個(gè)簡單下載器

    這篇文章主要為大家詳細(xì)介紹了java如何基于Socket制作一個(gè)簡單下載器,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論