項(xiàng)目中SpringBoot配置文件未生效的原因分析與解決方法
前言
在日常開發(fā) Spring Boot 項(xiàng)目的時(shí)候,大家應(yīng)該都遇到過這樣一種情況:明明寫了 application.yml,但是項(xiàng)目跑起來之后,配置好像完全沒被加載。比如數(shù)據(jù)庫連接還是舊的值,日志級別也沒生效。這種情況其實(shí)挺常見,往往不是 Spring Boot 本身有問題,而是我們在配置文件路徑、Profile 激活或者 IDE 啟動參數(shù)上出了岔子。
這篇文章就來聊聊 Spring Boot 配置文件未生效 的幾個(gè)典型場景,并配合 Demo 代碼來演示如何解決。
配置文件路徑問題
首先需要明確:Spring Boot 默認(rèn)會從以下位置加載配置文件(優(yōu)先級從高到低):
classpath:/application.ymlclasspath:/config/application.ymlfile:./application.ymlfile:./config/application.yml
所以,如果你把 application.yml 放在了一個(gè)奇怪的位置(比如 resources/configs/),自然不會生效。
來看個(gè)例子:
# src/main/resources/application.yml
server:
port: 8081
spring:
application:
name: demo-app
然后寫一個(gè)最簡單的 Spring Boot 應(yīng)用:
@SpringBootApplication
@RestController
public class DemoApplication {
@Value("${server.port}")
private int port;
@GetMapping("/hello")
public String hello() {
return "App is running on port: " + port;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
如果 application.yml 正常被加載,啟動后訪問 http://localhost:8081/hello,會看到:
App is running on port: 8081
但如果你把 application.yml 放到 src/main/resources/configs/application.yml,那它就不會生效,Spring Boot 根本不會去那個(gè)目錄找。
解決辦法:要么挪到正確路徑,要么用 --spring.config.location 指定路徑:
java -jar demo.jar --spring.config.location=classpath:/configs/
Profile 沒有正確激活
Spring Boot 支持多環(huán)境配置,比如:
# application.yml
spring:
profiles:
active: dev
# application-dev.yml server: port: 8082 # application-prod.yml server: port: 8083
如果你沒激活 profile,那么默認(rèn)只會加載 application.yml。有時(shí)候大家忘記在 application.yml 里寫 spring.profiles.active,導(dǎo)致環(huán)境配置根本沒切換。
另一種情況是你在 IDEA 里配置了 VM options,例如:
-Dspring.profiles.active=prod
那就會優(yōu)先使用 application-prod.yml,而不是 application-dev.yml。
小 Demo 驗(yàn)證:
@Value("${server.port}")
private int port;
@GetMapping("/profile")
public String profile() {
return "Running on port: " + port;
}
當(dāng)激活 dev 時(shí),返回 Running on port: 8082;當(dāng)激活 prod 時(shí),返回 Running on port: 8083。
如果你明明寫了 application-dev.yml 卻發(fā)現(xiàn)不起作用,那大概率是 spring.profiles.active 沒有正確指定。
IDEA 啟動配置的問題
很多同學(xué)在用 IDEA 跑 Spring Boot 項(xiàng)目的時(shí)候,遇到配置不生效,其實(shí)是因?yàn)?IDEA 的 Run/Debug Configurations 里沒傳遞參數(shù)。
比如你在命令行里用:
java -jar demo.jar --spring.profiles.active=dev
是沒問題的。
但是在 IDEA 里如果你什么都不配,就可能跑成默認(rèn)環(huán)境。正確做法是在 Run/Debug Configurations → VM options 里加上:
-Dspring.profiles.active=dev
這樣無論是運(yùn)行還是調(diào)試,都會加載對應(yīng)的配置文件。
實(shí)際場景舉例
舉個(gè)比較真實(shí)的場景:
有個(gè)同事寫了 application-dev.yml 配置了數(shù)據(jù)庫連接:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo
username: root
password: root123
結(jié)果啟動的時(shí)候報(bào)錯(cuò):
Cannot load driver class: com.mysql.cj.jdbc.Driver
后來排查發(fā)現(xiàn),原因有兩個(gè):
application-dev.yml沒生效,因?yàn)?spring.profiles.active沒指定;- Maven 依賴缺少
mysql-connector-java。
改好之后就正常運(yùn)行了。這個(gè)案例說明:配置文件問題往往不止一個(gè),要結(jié)合日志一步步分析。
總結(jié)
Spring Boot 配置文件未生效主要有三個(gè)大坑:
- 路徑問題:放錯(cuò)位置,Spring Boot 根本找不到。
- Profile 激活問題:沒指定
spring.profiles.active,導(dǎo)致環(huán)境沒切換。 - IDEA 配置問題:運(yùn)行參數(shù)沒傳遞,結(jié)果和預(yù)期不一致。
我的建議是:
- 路徑一定放在標(biāo)準(zhǔn)目錄;
- 配置多環(huán)境時(shí),一定檢查
spring.profiles.active; - 用 IDEA 啟動時(shí),確保 VM options 和命令行一致;
- 另外,多看看啟動日志,Spring Boot 在啟動時(shí)會打印加載了哪些配置文件,非常直觀。
到此這篇關(guān)于項(xiàng)目中SpringBoot配置文件未生效的原因分析與解決方法的文章就介紹到這了,更多相關(guān)SpringBoot配置文件未生效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostMan傳@RequestParam修飾的數(shù)組方式
這篇文章主要介紹了PostMan傳@RequestParam修飾的數(shù)組方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
詳解java代碼中init method和destroy method的三種使用方式
這篇文章主要介紹了詳解java代碼中init method和destroy method的三種使用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Intellij?IDEA?中調(diào)試?maven?插件的步驟
這篇文章主要介紹了Intellij?IDEA?中調(diào)試?maven?插件,本文分步驟給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
關(guān)于Spring?Boot項(xiàng)目的?log4j2?核彈漏洞問題(一行代碼配置搞定)
相信昨天,很多小伙伴都因?yàn)長og4j2的史詩級漏洞忙翻了吧,不過我看到群里發(fā)出來的各種修復(fù)方法,還真是不好看...所以這里也提一下Spring Boot用戶怎么修復(fù)最簡單吧,對Spring Boot log4j2 核彈漏洞問題感興趣的朋友參考下吧2021-12-12
解決httpServletRequest.getParameter獲取不到參數(shù)的問題
這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Spring boot如何快速的配置多個(gè)Redis數(shù)據(jù)源
這篇文章主要介紹了Spring boot如何快速的配置多個(gè)Redis數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
MybatisPlus字段自動填充失效,填充值為null的解決方案
這篇文章主要介紹了MybatisPlus字段自動填充失效,填充值為null的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java語言面向?qū)ο缶幊趟枷胫惻c對象實(shí)例詳解
這篇文章主要介紹了Java語言面向?qū)ο缶幊趟枷胫惻c對象實(shí)例詳解,還是十分不錯(cuò)的,這里給大家分享下,需要的朋友可以參考。2017-10-10

