将环境变量传递给 application.yml

Posted

技术标签:

【中文标题】将环境变量传递给 application.yml【英文标题】:Passing environment variables to application.yml 【发布时间】:2021-09-05 09:06:26 【问题描述】:

在 Spring Boot 应用程序中,我想将一些环境变量从 env 文件(可用于不同环境)传递给 application.yml。我们决定不为不同的环境使用 spring 配置文件,因为使用 .env 文件可以使我们以后更容易迁移到云。在 application.yml 中定义这些变量如下:

     datasource:
        driverClassName: org.mariadb.jdbc.Driver
        username: "$SPRING_DATASOURCE_USERNAME"
        password: "$SPRING_DATASOURCE_PASSWORD"

此外,我使用以下命令导出了 .env 文件中的所有环境变量,其中还包括 $SPRING_DATASOURCE_USERNAME 和 $SPRING_DATASOURCE_PASSWORD:

    export $(grep -v '^#' .env | xargs -d '\n')

运行时

    ./gradlew test

我收到以下错误:

    Missing property (SPRING_DATASOURCE_USERNAME) for Groovy template expansion. 

问题是gradle wrapper没有获取系统环境变量或者导出的环境变量。有没有办法使用 .env 文件解决这个问题?任何提示表示赞赏!

【问题讨论】:

不能用@TestPropertySource吗? 添加属性文件没有帮助。我需要添加任何 gradle 配置吗?是否可以在不更改任何代码的情况下做到这一点? .env 文件的格式是什么,它们是如何添加到 Spring 环境中的? 【参考方案1】:

由于您已将它们导出为环境变量,您可以从您的application.yml 中删除spring.datasource.usernamespring.datasource.password。 Spring 会自动从环境变量中搜索它们。您不需要像模板一样指定它们。一个极端的用法是通过环境变量导出所有属性并将application.yml留空。

参考文献

优先级:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config 规则:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.typesafe-configuration-properties.relaxed-binding.environment-variables

【讨论】:

以上是关于将环境变量传递给 application.yml的主要内容,如果未能解决你的问题,请参考以下文章

特定环境的spring yml文件

yml文件中引用系统环境变量

从application.yml/java、spring中读取应用变量(assoc数组)

将环境变量传递给多个命令

如何将环境变量传递给传递给xmllint的命令?

将主机环境变量传递给 dockerfile