【问题标题】:Typesafe Config Environment Variables类型安全配置环境变量
【发布时间】:2013-09-17 05:15:22
【问题描述】:

尝试在配置文件中使用${HOSTNAME} 不起作用!根据文档,配置文件应该解析文档中提到的环境变量:

如果替换不能在配置本身中解析,则它们会退回到环境变量,因此 ${HOME} 将按您的预期工作。此外,大多数配置都合并了系统属性,因此您可以使用 ${user.home}。

有没有办法将主机名添加到配置文件中?

复制
host.name=${HOSTNAME} 添加到application.conf 文件中,然后尝试从任何地方访问它。例如尝试添加

Logger.info(s"Hostname is ${current.configuration.getString("host.name").getOrElse("NOT-FOUND")}")

Global.scala

环境
这是在echo $HOSTNAME 生成precise32 的RHEL6 环境中运行的,因此环境变量存在,这不是程序hostname

【问题讨论】:

  • 您是否将 HOSTNAME 明确设置为环境变量? “主机名”本身就是一个程序。您在哪个平台上运营?您的 application.conf 看起来如何?如何检索配置设置?
  • 是的,请告诉我们您的application.conf 以及您在应用程序中的使用位置。
  • 更新问题。 HOSTNAME 在服务器上设置,在 application.conf 中没有什么特别的,除了尝试设置 host.name 配置变量。
  • FWIW 我刚刚遇到了文档和实际实现之间同样令人讨厌的差异。如果我没记错的话,几年前也有同样的错误。也许 Typesafe 人已经放弃了 Typesafe Config 项目?

标签: configuration playframework akka typesafe


【解决方案1】:

解决方案似乎是通过系统属性将主机名传递为-Dhost.name=$HOSTNAME-Dhost.name=$(hostname)。我想在 Windows 中它会是别的东西,但这适用于 *NIX 环境。

除非有人能想出更干净的东西,否则这将是公认的答案。

【讨论】:

  • 这里发生的是 HOSTNAME 是一个 shell 变量,而不是一个环境变量。请参阅stackoverflow.com/questions/3341372/… 另一种说法是 HOSTNAME 没有“导出”,它只是 bash 进程的内部。用低级术语来说,当 bash 派生一个子进程时,它不会将未导出的变量传递给子进程的环境。实际含义是,您可以在启动 JVM 之前通过执行 export HOSTNAME 来解决此问题。
【解决方案2】:

您应该查看调用System.getenv("HOSTNAME") 是否返回非空值。如果不是,那么 HOSTNAME 根据 java 运行时不是环境变量,这对于将其映射到类型安全配置中的配置属性很重要。我用HOSTNAME 尝试了这个,即使我可以在 bash 中回显它,它在 java 中也不能作为 env 替换。我将其更改为USER,一切正常。

【讨论】:

  • 您也说得对,测试验证了 HOSTNAME 在 JVM 中作为环境变量似乎不可用。谢谢
【解决方案3】:

这可能不起作用,因为 $HOSTNAME 实际上并不是一个环境变量:

jamesw@T430s:~$ echo $HOSTNAME
T430s
jamesw@T430s:~$ export|grep HOSTNAME
jamesw@T430s:~$

所以它一定是其他一些特殊的 bash 东西。

【讨论】:

  • 如果应用是通过 shell 调用的,那么这个变量应该是可用的
  • 我的立场是正确的:scala> System.getenv("HOSTNAME")scala> System.getProperty("HOSTNAME") 都返回 null。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2022-08-13
  • 2020-08-15
  • 1970-01-01
相关资源
最近更新 更多