类型安全的配置环境变量

9
尝试在配置文件中使用${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


你是否明确地将HOSTNAME设置为环境变量?“hostname”本身是一个程序。你在哪个平台上操作?你的application.conf文件是什么样子的,你如何检索配置设置? - Schleichardt
是的,请展示你的 application.conf 文件,同时也展示在应用程序中使用它的位置。 - maba
更新问题。HOSTNAME已在服务器上设置,除了尝试设置“host.name”配置变量外,在application.conf中没有特殊设置。 - tysonjh
1
就我所知,我刚刚遇到了文档和实际实现之间的这个令人恼火的差异。如果我没记错的话,几年前也有同样的错误。也许Typesafe的开发人员已经放弃了Typesafe Config项目? - eirirlar
3个回答

8
解决方案似乎是通过系统属性传递主机名,如-Dhost.name=$HOSTNAME-Dhost.name=$(hostname)。我想在Windows上可能是其他东西,但这适用于*NIX环境。
除非有更好的解决方案,否则将接受此答案。

8
这里发生的情况是,HOSTNAME 是一个 shell 变量而不是环境变量。请参阅 https://dev59.com/SHA75IYBdhLWcg3wW3oZ。换句话说,HOSTNAME 没有被“导出”,它只是 bash 进程内部的变量。以低级别的术语来说,当 bash 分叉出一个子进程时,它不会将未导出的变量传递给子进程的环境。实际影响是,你可以通过在启动 JVM 之前执行 export HOSTNAME 来解决这个问题。 - Havoc P

7
这可能不起作用是因为$HOSTNAME似乎并不是一个环境变量:
jamesw@T430s:~$ echo $HOSTNAME
T430s
jamesw@T430s:~$ export|grep HOSTNAME
jamesw@T430s:~$

所以这一定是其他特殊的bash事情。

如果应用程序通过 shell 调用,则应该可以使用这个变量。 - tysonjh
1
我改正了:scala> System.getenv("HOSTNAME")scala> System.getProperty("HOSTNAME") 都返回 null。 - tysonjh

1
你应该查看调用 System.getenv("HOSTNAME") 是否返回非空值。如果没有,则 HOSTNAME 不是一个环境变量,这对于将其映射到类型安全配置中的配置属性非常重要。我尝试过使用 HOSTNAME,即使我可以在 bash 中回显它,在 java 中作为 env 替换也无法使用。我将其更改为 USER,一切都按预期工作了。

你说得也对,测试验证了在JVM中作为环境变量的HOSTNAME似乎不可用。谢谢。 - tysonjh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接