Springboot讀取外部配置文件,項目部署時配置讀取不到問題及解決
需求
最近項目部署,但是每個地方都有個別地方配置的差異,我們每次打包后再進行修改極度不方便,這里將有關(guān)的配置都抽取出來,放在jar包外進行配置,這樣以后更新時只需要將jar包更換然后重啟即可,配置讀取外部的固定配置文件。
SpringBoot 配置
springboot默認配置的加載位置和優(yōu)先級順序
springboot啟動時會掃描以下位置的application.properties和application.yml文件作為默認的配置文件。
- file: ./config/
- file: ./
- classpath: /config/
- classpath: /
所有的配置文件都會被加載,但高優(yōu)先級的配置會覆蓋低優(yōu)先的配置,上面的優(yōu)先級為由高到低排列,./config/ 的優(yōu)先級最高,我們創(chuàng)建項目時默認的放在resources目錄下的優(yōu)先級是最低的。
classpath可以理解為我們項目內(nèi)部的沒打包時的resources文件夾下的,file理解為和jar包同級的目錄(如果在linux中啟動項目時寫的啟動路徑的相對位置和file的文件不是同級時外部配置文件會出現(xiàn)讀取失敗,可以翻到文章最下面)。
配置文件中帶spring.profile的文件會優(yōu)先被加載
啟動項目時指定配置文件的位置
java -jar xxxx.jar -Dspring.config.location=/home/test/application.yml
啟動時加載/home/test文件夾下的application.yml作為配置文件。
這里還可以指定端口、生效的配置文件、日志打印等
java -jar xxxx.jar -Dspring.profiles.active=prod -Dspring.config.location=/home/test/application.yml -Dserver.port=8081 > logs/xxxlog.log 2>&1 &
application配置
- 非默認配置文件,這里我是config.properties
可以通過注解_@PropertySource_ 來指定配置文件的位置,value中提供兩種方式 classpath 和 file
@Configuration @ConfigurationProperties(prefix = "config", ignoreUnknownFields = false) @PropertySource(name = "config.properties" ,value = {"classpath:/config.properties","file:./config/config.properties"} ,ignoreResourceNotFound = true ,encoding = "UTF-8")
value是一個數(shù)組,可以放多個配置文件,從左到右進行加載,后面的會覆蓋掉前面的配置,ignoreResourceNotFound = true主要用來忽略文件不存在的情況,如果第一個目錄下沒有找到對應的文件內(nèi)容,就向后繼續(xù)找不加這個配置第一個文件找不到時會報錯。
ConfigurationProperties 是用來減少下面@Value注解的參數(shù),如果不加這個注解,配置項中配置的是 config.username = 'liuch’
這時你的@Value(“config.maintType" ) 需要寫完整,如果配置了以后 @Value("{config.maintType}")需要寫完整,如果配置了以后@Value("config.maintType")需要寫完整,如果配置了以后@Value("{maintType}”)即可。
部署時配置讀取失敗
注意: 在linux啟動項目時,config文件夾要和啟動根目錄的相對路徑是同一級,否則讀取不到配置,需要在啟動項目時指定配置文件位置。
例:
現(xiàn)在jar和config放在 /home/liuch/app/ 文件夾下,我們啟動時需要先進入到 /home/liuch/app 目錄,然后再
nohup java -jar xxx.jar >/dev/null 2>&1 &,直接使用命令nohup java -jar /home/liuch/app/xxx.jar >/dev/null 2>&1 & 啟動時不會去讀取config文件夾下的配置文件,需要使用-Dspring.config.location= 指定配置文件位置,此時我們的非默認配置文件是讀取不到的,我們可以在application.yml文件中配置需要加載的非默認配置文件位置
server: port: 8088 config: path: /home/liuch/config.properties
@PropertySource(value = {"file:${config.path}"}, encoding="utf-8")
下面的@Value的用法和之前一樣。
附:
springboot項目啟動時的參數(shù)
/usr/local/java/jdk1.8.0_131/bin/java -jar -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/spb_zcmweb/8103/dump/heap/ -Djava.io.tmpdir=/data/liuch/tmp/ -Dserver.port=8103 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=5103 -Dcom.sun.management.jmxremote.rmi.port=6103 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.access.file=/usr/local/java/jdk1.8.0_131/jre/lib/management/jmxremote.access -Xmx2G -Xms2G -XX:+DisableExplicitGC -verbose:gc -Xloggc:/data/liuch/log/gc.%t.log -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTaskTimeStamps -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Dserver.connection-timeout=60000 -Dserver.tomcat.accept-count=1000 -Dserver.tomcat.max-threads=300 -Dserver.tomcat.min-spare-threads=65 -Dserver.tomcat.accesslog.enabled=false -Dserver.tomcat.accesslog.directory=/data/liuch/log/ -Dserver.tomcat.accesslog.prefix=access_log -Dserver.tomcat.accesslog.pattern=combine -Dserver.tomcat.accesslog.suffix=.log -Dserver.tomcat.accesslog.rotate=true -Dserver.tomcat.accesslog.rename-on-rotate=true -Dserver.tomcat.accesslog.request-attributes-enabled=true -Dserver.tomcat.accesslog.buffered=true -XX:NewRatio=4 -XX:SurvivorRatio=30 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=8 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:ParallelGCThreads=24 -XX:ConcGCThreads=24 -XX:-UseGCOverheadLimit -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=1 -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+ParallelRefProcEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=6000 -XX:CompileThreshold=10 -XX:MaxInlineSize=1024 -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -Djsse.enableCBCProtection=false -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8 -Dlog.path=/data/liuch/log/ -Dspring.profiles.active=online /data/liuch/deploy/xxxx.jar zcmweb
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java編程實現(xiàn)深度優(yōu)先遍歷與連通分量代碼示例
這篇文章主要介紹了Java編程實現(xiàn)深度優(yōu)先遍歷與連通分量代碼示例,2017-11-11Java?-jar參數(shù)設(shè)置小結(jié)
本文主要介紹了Java?-jar參數(shù)設(shè)置小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06Java List轉(zhuǎn)換成String數(shù)組幾種實現(xiàn)方式詳解
這篇文章主要介紹了Java List轉(zhuǎn)換成String數(shù)組幾種實現(xiàn)方式詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題詳析
在Java和MySQL中小數(shù)的精度可能會受到限制,如float類型的小數(shù)只能精確到6-7位,double類型也只能精確到15-16位,這篇文章主要給大家介紹了關(guān)于Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題,需要的朋友可以參考下2024-01-01springboot程序啟動慢-未配置hostname的解決
這篇文章主要介紹了springboot程序啟動慢-未配置hostname的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08