Configuration 类型安全配置环境变量

Configuration 类型安全配置环境变量,configuration,playframework,akka,typesafe,Configuration,Playframework,Akka,Typesafe,试图在配置文件中使用${HOSTNAME}无效!根据文档,配置文件应解析文档中提到的环境变量: 如果环境变量不能在配置本身中解析,那么替换将返回到环境变量,因此${HOME}将按照您的预期工作。此外,大多数配置都合并了系统属性,因此您可以使用${user.home} 有没有办法将主机名输入配置文件? 复制 将host.name=${HOSTNAME}添加到application.conf文件中,然后尝试从任何地方访问它。例如,尝试添加 Logger.info(s"Hostname is ${cu

试图在配置文件中使用
${HOSTNAME}
无效!根据文档,配置文件应解析文档中提到的环境变量:

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

有没有办法将主机名输入配置文件?

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

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

环境

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

您应该查看调用
System.getenv(“HOSTNAME”)
是否返回非空值。如果不是,则根据java运行时,
HOSTNAME
不是一个env变量,这对于将其映射到typesafe配置中的配置属性非常重要。我用
HOSTNAME
尝试了这个方法,尽管我可以在bash中使用它,但它在java中不能作为env替代。我将其更改为
USER
,一切都按预期进行。

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

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

因此,它一定是其他一些特殊的bash东西。

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


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

是否将主机名显式设置为环境变量?“主机名”本身就是一个程序。你们在哪个站台上操作?你的application.conf外观如何?你如何检索配置设置?是的,请向我们展示你的
application.conf
,以及你在应用程序中使用它的位置。更新的问题。主机名是在服务器上设置的,在application.conf中除了试图设置
host.name
configuration variable.FWIW之外,没有什么特别之处。我只是在文档和实际实现之间遇到了同样令人讨厌的差异。如果我没记错的话,几年前也有同样的bug。也许Typesafe的家伙已经放弃了Typesafe配置项目?如果应用程序是通过shell调用的,那么这个变量应该是可用的。请更正:
scala>System.getenv(“HOSTNAME”)
scala>System.getProperty(“HOSTNAME”)
都返回null。您也正确,测试验证了主机名作为环境变量在JVM中不可用。谢谢这里发生的事情是HOSTNAME是一个shell变量,而不是一个环境变量。另一种说法是主机名不是“导出”的,它只是bash进程的内部。在低级术语中,当bash分叉子进程时,它不会将未报告的变量传递给子进程的环境。实际上,您可以通过在启动JVM之前执行导出主机名来解决这个问题。