Spring Boot:如何在application.properties中指定具有破折号的环境变量?

Dan*_*lan 9 java spring spring-boot

我有一个application.properties看起来像这样的文件:

mcl.sso.frontend-url=http://blah.com:9001
mcl.sso.mocking-agent=false
Run Code Online (Sandbox Code Playgroud)

我试图从命令行覆盖这两个变量.这应该可以通过设置环境变量来实现.这是我运行命令的方式:

MCL_SSO_FRONTEND_URL='foobar' MCL_SSO_MOCKING_AGENT='true' ./gradlew run
Run Code Online (Sandbox Code Playgroud)

但是,当我打印出这些变量的值时,mcl.sso.mocking-agent等于"true"(如预期的那样),但mcl.sso.frontend-url仍然等于" http://blah.com:9001 "(意外).为什么不mcl.sso.frontend-url改变财产的价值?我只能假设这与Spring将环境​​变量转换为属性键的方式有关,但我找不到任何特定的文档.

小智 51

来自spring-boot 文档

\n

从环境变量绑定

\n

大多数操作系统对可用于环境变量的名称施加严格的规则。例如,Linux shell 变量只能包含字母 ( atozAto Z)、数字 ( 0to 9) 或下划线字符 ( _)。按照惯例,Unix shell 变量的名称也采用大写形式。

\n

Spring Boot\xe2\x80\x99 的宽松绑定规则被设计为尽可能兼容这些命名限制。

\n

要将规范形式的属性名称转换为环境变量名称,您可以遵循以下规则:

\n
    \n
  • 将点 ( .) 替换为下划线 ( _)。
  • \n
  • 删除所有破折号 ( -)。
  • \n
  • 转换为大写。
  • \n
\n

例如,配置属性spring.main.log-startup-info将是名为 的环境变量SPRING_MAIN_LOGSTARTUPINFO

\n

绑定到对象列表时也可以使用环境变量。要绑定到 a List,变量名称中的元素编号应用下划线括起来。

\n

例如,配置属性my.service[0].other将使用名为 的环境变量MY_SERVICE_0_OTHER

\n


Ste*_*oll 5

从 Spring Boot 开始,此问题已得到修复1.2.5。以前,您必须使用MCL_SSO_FRONTEND-URL(注意不能转换为下划线的破折号)。

您可以使用此示例项目来使用绑定。

  • 在 Linux 上,环境变量键中不允许使用破折号。解决方案是使用`MCL_SSO_FRONTENDURL`。即属性名称本身没有分隔符。记录在这里:https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0 (7认同)
  • Stephane:显然这就是你的意思。我不清楚属性名称中是否应该有 **no** 分隔符,即使它由多个单词组成。阅读您的答案后,我必须先玩一下,然后才能做对。只是想说清楚。 (3认同)