SpringBoot --spring.profiles.active相關問題
springboot配置檔案
springboot
支援yml
或者properties
兩種方式- 無論是哪種方式,都可以指定
active
的profiles
的
profiles官方文件 spring
支援在application.properties
中直接配置資料庫連線。
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=test
spring.datasource.password=test12345
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 當我們開發功能的時候,區分本地測試,測試伺服器,正式上線的伺服器,分別為
dev
,qa
,prod
- 很重要的一點是,這三個環境的資料庫的密碼並不一樣,因此如果你每次都重新修改資料庫的配置,然後再重新出版本,會很麻煩,因為程式碼並沒有變化,只不過環境變了
因此springboot,支援active的指向
也支援命令列的方式修改java -jar test.jar --spring.profiles.active=prod
profiles支援多個active
在版本稍微高一點點的springboot中,都是支援多個active的profiles的
spring.profiles.active=dev,qa
多個的規則是,靠後的會覆蓋在前面的配置
比如dev
和qa
的properties裡面,都有spring.datasource.password
你的本地dev
裡面是dev12345
,而qa
上是qa12345
如果qa
是在,
後面,那麼qa
的spring.datasource.password
就會覆蓋dev
裡面的密碼,所以會使用qa
裡面的密碼。
profiles支援外部檔案
假設專案內,只有兩個properties
檔案,一個是本地除錯的,一個是release
到正式伺服器上的檔案。
則在自己公司是可以這麼設定的,並且可以順利執行的。
但如果要把該工程,分發給客戶的環境上執行,就會有問題了,因為客戶的環境是千奇百怪的。
除非要求客戶的環境和各種配置,跟我們的正式伺服器一模一樣,否則就會出現各種密碼錯誤,最突出的就是客戶的資料庫密碼想要自己設定。這樣我們的配置檔案不夠用了,直接在外部配置一個properties
,裡面把所有客戶想要自己設定的屬性,都寫上,然後放在後面,覆蓋我們本身的prod
或者dev
。
java -jar test.jar --spring.profiles.active=prod,ext
執行,就會讀取application-ext.properties
中的內容了,並且級別比prod
中的高,所以即使war
內的properties
的值是自己本地的值,也不要緊,只需要在外部的配置檔案中修改就行。
centOS7伺服器上執行springboot問題
服務需要開機啟動
自己寫一個service
固然可以,但是一般還是用supervisor
來管理jar
包。
因此自己將服務寫在了supervisor
的外部檔案中,即:開啟include
[include]
files = supervisord.d/*.ini ;可以指定一個或多個以.ini結束的配置檔案
在supervisord.d
資料夾下面,我新建了一個javatest.ini
檔案。
[program:test]
command=/usr/bin/java -Xms128m -Xmx256m -jar /opt/test/test.war --spring.profiles.active=prod,ext --server.port=8080
autostart=true
startsecs=10
autorestart=false
startretries=3
user=root
priority=999
redirect_stderr=false
stdout_logfile_maxbytes=10MB
stdout_logfile_backups = 20
stdout_logfile=/opt/test/logs/java8080.out
stderr_logfile=/opt/test/logs/java8080err.out
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=20
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
stopasgroup=false
killasgroup=false
使用supervisor來管理我們的服務,是它可以開機啟動。
資料庫連線不上
但執行了之後,還是會提示DB連線錯誤,看了一下錯誤資訊
java.sql.SQLException: Access denied for user 'aaaaaaa'@'localhost' (using password: YES)
明明在application-ext.properties
中修改了資料庫的使用者名稱和密碼,為什麼用的還是prod
中的使用者名稱呢?
分析
-
javatest.ini
檔案沒有寫對
自己檢視了supervisor
的官方文件,裡面有解釋,在command
裡面,帶引數的,有時候需要用""
包起來才行,結果改成command=/usr/bin/java -Xms128m -Xmx256m -jar /opt/test/test.war --spring.profiles.active="prod,ext" --server.port=8080
也還是不行。 -
分析入參
自己在WebApplication
的main
方法中,將所有入參都列印出來,發現入參並沒有問題。 -
懷疑先後順序問題
於是使用了spring.profiles.include
,修改command
:
command=/usr/bin/java -Xms128m -Xmx256m -jar /opt/test/test.war --spring.profiles.active=ext --spring.profiles.include=prod --server.port=8080
發現依然報錯,這個時候,忽然想到,有可能是沒有發現properties
檔案
於是在supervisord.conf
的同級目錄下面,將application-ext.properties
檔案複製到該資料夾。
發現一切正常。
結論
--spring.profiles.active=prod,ext
中的prod
和ext
,spring會去尋找application-prod.properties
和application-ext.properties
包括war
包內,和執行指令碼的那個目錄下面,而不是war
存放的目錄下。
相關文章
- SpringBoot-相關問題Spring Boot
- 翻譯 | SpringBoot相關的面試問題Spring Boot面試
- octomap相關問題
- django相關問題Django
- electron相關問題
- Docker 相關問題Docker
- springboot+springcloud相關面試題Spring BootGCCloud面試題
- Java相關問題整理Java
- 大模型相關問題大模型
- python pip相關問題Python
- springboot 相關注解Spring Boot
- Spring相關問題記錄Spring
- 瀏覽器相關問題瀏覽器
- mysql相關問題總結MySql
- Silverlight安裝相關問題
- RUST所有權相關問題Rust
- 關於盒模型相關的問題模型
- [20191202]關於hugepages相關問題.txt
- 關於 go-micro 相關問題Go
- Springboot日誌相關Spring Boot
- Springboot小程式相關Spring Boot
- HandlerThread解析以及相關問題分析thread
- 多執行緒相關問題執行緒
- 中介軟體相關問題整理
- 個人專案相關問題
- 資料庫事物相關問題資料庫
- 上傳下載相關問題
- java語言相關的問題Java
- SpringBoot(一)啟動相關Spring Boot
- [20190108]rlwrap sqlplus tee相關問題.txtSQL
- 前端面試之js相關問題前端面試JS
- [20180413]熱備模式相關問題.txt模式
- 面試遇到的redis相關問題面試Redis
- Laravel佇列相關問題記錄Laravel佇列
- TCP/IP 協議相關的問題TCP協議
- svn相關問題解決辦法
- MySQL中鎖的相關問題DTQUMySql
- win10 下關於redis的相關問題Win10Redis