
Spring Boot 应用在 YAML 中引用环境变量(如 ${URL})时未正确解析,通常并非配置本身错误,而是开发环境(如 IntelliJ IDEA)未正确加载或继承系统环境变量所致。
spring boot 应用在 yaml 中引用环境变量(如 `${url}`)时未正确解析,通常并非配置本身错误,而是开发环境(如 intellij idea)未正确加载或继承系统环境变量所致。
在 Spring Boot 中,YAML 或 properties 文件天然支持通过 ${VAR_NAME} 语法引用环境变量或系统属性,前提是这些变量在应用启动前已对 JVM 进程可见。你提供的配置完全合法:
spring:
datasource:
url: ${URL}
username: ${USERNAME}
password: ${PASSWORD}
只要系统中已设置对应环境变量(例如在终端执行 export URL="jdbc:mysql://localhost:3306/mydb"),且 Spring Boot 应用以该环境上下文启动,变量即可被自动解析。
⚠️ 常见陷阱:IDE 启动环境与终端不一致
尤其在 IntelliJ IDEA 中,IDE 自身作为 GUI 应用启动时,默认不会继承当前终端的 shell 环境变量(如 ~/.zshrc 或 ~/.bash_profile 中定义的变量)。即使你在终端中 export 了变量,直接点击 IDE 的 ▶️ 运行按钮,Spring Boot 进程仍会看到一个“干净”的、几乎为空的环境,导致 ${URL} 无法替换,最终抛出 IllegalArgumentException: URL must start with 'jdbc' 等异常。
✅ 解决方案如下:
重启 IntelliJ IDEA(关键!)
如答案所指出:修改环境变量后(尤其是全局 shell 配置文件),必须完全退出并重启 IntelliJ,而非仅重启应用。IDE 在启动时读取一次系统环境,后续运行配置均复用该快照。-
在 Run Configuration 中显式配置环境变量
- 打开 Run → Edit Configurations…
- 选择你的 Spring Boot 启动配置
- 展开 Environment variables 字段(或点击右侧 ...)
- 添加:
URL=jdbc:mysql://localhost:3306/devdb USERNAME=devuser PASSWORD=devpass
- ✅ 勾选 Include system environment variables(确保不覆盖基础 PATH 等)
-
验证环境变量是否生效(推荐)
在启动类中临时添加日志,确认变量已被加载:@SpringBootApplication public class MyApp { public static void main(String[] args) { System.out.println("Resolved URL: " + System.getenv("URL")); // 检查原生环境变量 SpringApplication.run(MyApp.class, args); } } -
补充建议:使用 spring.config.import 提升可维护性(Spring Boot 2.4+)
若需多环境灵活切换,可将敏感配置外置为 .env 文件,并通过:spring: config: import: optional:file:./.env[.properties]避免硬编码或依赖 IDE 行为,更符合十二要素应用原则。
? 总结:Spring Boot 的环境变量解析机制本身可靠;问题根源几乎总是开发工具链的环境隔离问题。优先检查 IDE 启动上下文,重启 + 显式配置双管齐下,即可稳定启用基于环境变量的动态配置。











