当前位置: 首页 > 知识库问答 >
问题:

使用环境变量在application.properties中重写变量的奇怪行为

阎阎宝
2023-03-14

我正在使用Spring Boot2,通过阅读这里关于外部化属性的文档,我希望可以通过声明一个同名的os环境变量来覆盖application.properties中变量的值。

所以我做了如下的尝试。

首先,在src/main/resources/application.properties中声明以下2个变量

my.prop = hello   
myProp = hello    
@SpringBootApplication
public class Main {

    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    @Value("${my.prop}")
    String myDotProp;

    @Value("${myProp}")
    String myProp;

    @Value("${my.env.prop}")
    String envDotProp;

    @PostConstruct
    public void test() {
        logger.debug("my.prop : " + myDotProp);
        logger.debug("myProp : " + myProp);
        logger.debug("my.env.prop : " + envDotProp);
    }

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.prop : hello
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : myProp : world
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.env.prop : world

>

  • Spring可以看到环境变量,而不管是否有have点(.)是否在变量名中,如mypropmy.env.prop所示

    Spring只能在application.properties中使用同名os环境变量的值重写该变量的值,前提是该变量的名称不包含点(.)如mypropmy.prop所示:myprop的值已经成功地覆盖到world,但是my.prop的值仍然保持hello,即使我声明了os env变量my.prop

    这种行为有什么原因吗?有没有一种方法可以配置Spring,以便在属性变量中使用dot,并使用os env变量重写它们?

  • 共有1个答案

    宦子琪
    2023-03-14

    将环境变量中的.替换为_.
    。例如,如果在Spring Boot中属性名为my.env.prop以便重写它,请使用名为my_env_prop的环境变量,而Spring会自动执行转换。

    .出现问题的原因是某些操作系统不支持环境变量名称中的.

    这里讨论的类似问题:如何通过环境变量设置名称中带有下划线的Spring Boot属性?

     类似资料:
    • 问题内容: 我一直在阅读官方文档,但无法找到有关环境变量的任何信息。显然,有一些社区项目支持环境变量,但这对我来说可能是过大了。所以我想知道在使用Vue CLI创建的项目上是否有一些简单的开箱即用的功能可以正常工作。 例如,我可以看到,如果执行以下操作,则会打印出正确的环境,这意味着已经设置好了吗? 我对环境变量和Node有点陌生。 仅供参考,使用Vue CLI 3.0 beta版。 问题答案:

    • 最佳实践最好在values.yaml文件中定义环境变量还是在templates/deployment.yaml放入中定义环境变量? 如果有您使用的示例应用程序,您能提供帮助吗?

    • 问题内容: 当我运行以下Jenkins管道脚本时: 我收到此错误: 如果从中删除,则可以正常工作。有人可以解释导致此行为的作用域规则吗? 问题答案: TL; DR 定义的变量 与 主脚本主体不能从其他方法来访问。 定义的变量 ,而不 能够直接通过任何方法甚至从不同的脚本访问。这是一个坏习惯。 使用 和 注释定义的变量可以直接从同一脚本中定义的方法访问。 说明 当groovy编译该脚本时,它实际上将

    • 问题内容: 以下是来自java.lang.System类的代码(JDK版本1.6) 当我们在代码中编写代码时,为什么即使将“ out”设置为“ null”也不会得到NullPointerException 无论如何,将通过System类中的以下方法进行设置 那么为什么JLS需要方法? 问题答案: 看看-这个方法被称为启动事情,它调用的是一个方法。这将它与应该存在的位置联系在一起。 因此,即使该字段

    • Git 总是在一个 bash shell 中运行,并借助一些 shell 环境变量来决定它的运行方式。 有时候,知道它们是什么以及它们如何让 Git 按照你想要的方式去运行会很有用。 这里不会列出所有的 Git 环境变量,但我们会涉及最有的那部分。 全局行为 像通常的程序一样,Git 的常规行为依赖于环境变量。 GIT_EXEC_PATH 决定 Git 到哪找它的子程序 (像 git-commit

    • Puppeteer 寻找某些环境变量来帮助其操作。 如果 puppeteer 在环境中没有找到它们,这些变量的小写变体将从 npm 配置 中使用。 HTTP_PROXY, HTTPS_PROXY, NO_PROXY - 定义用于下载和运行 Chromium 的 HTTP 代理设置。 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD - 请勿在安装步骤中下载绑定的 Chromium。