亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot加載外部依賴的過程

發布時間:2021-08-26 16:28:32 來源:億速云 閱讀:179 作者:chen 欄目:編程語言

本篇內容介紹了“SpringBoot加載外部依賴的過程”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

背景

公司一個項目的大數據平臺進行改造,之前使用Structured Streaming作為實時計算框架,需要替換為替換為Kafka Streams,并使用SpringBoot包裝,使其可以納入微服務體系。

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

問題

然后在部署過程中就遇到了一個比較蛋疼的問題:因為遺留代碼的關系,部分配置項的名稱是自定義的,并使用java.util.ResourceBundle的getString()來讀取,而為了讓項目可以注冊到Eureka以及使用SpringBoot默認的日志配置,在配置文件中配置了eureka.client.serviceUrl.defaultZone以及logging.file等SpringBoot內置的配置項,并使用SpringBoot內置的配置讀取方式讀取。

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

java -jar EatMalonPeople.jar

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

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

啟動后,發現生效的配置項仍然是EatMalonPeople.jar這個jar包內的配置項......感覺不太科學啊。于是去查了查SpringBoot項目加載配置文件的順序,結果根據Spring官網的提示,SpringBoot加載配置文件application.properties的順序依次為:

當前目錄的cofnig目錄  當前目錄  classpath目錄下的/config目錄  classpath目錄

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

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

這樣jar包內就不含有配置文件了。再次使用

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

啟動后,應用程序能注冊到Eureka,然而使用ResourceBundle.getString()方法獲取的配置項竟然找不到了,直接throw出了內部封裝的找不到配置項錯誤!

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

解決

又是一頓好找,終于在官網的另一處發現了原因。

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

這個類有三個子類,分別是JarLauncher,WarLauncher,PropertiesLauncher,前兩個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重新打包,并且在運行時使用loader.path參數指定外部classpath地址:

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

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

“SpringBoot加載外部依賴的過程”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湖南省| 江北区| 济阳县| 宁武县| 揭西县| 平乐县| 洞头县| 牡丹江市| 莒南县| 中牟县| 涿鹿县| 读书| 顺昌县| 平陆县| 宜章县| 和林格尔县| 古交市| 宁远县| 浪卡子县| 泗阳县| 南澳县| 灵台县| 宿州市| 山东省| 新田县| 文登市| 琼海市| 高州市| 九江市| 松原市| 贵溪市| 长治县| 柯坪县| 晴隆县| 襄樊市| 沾化县| 鱼台县| 石门县| 滨海县| 奇台县| 禹城市|