Переменные среды конфигурации Typesafe

Попытка использовать ${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.


person tysonjh    schedule 12.09.2013    source источник
comment
Вы явно установили HOSTNAME как переменную среды? само имя хоста является программой. На какой платформе вы работаете? Как выглядит ваш application.conf и как получить настройки конфигурации?   -  person Schleichardt    schedule 12.09.2013
comment
Да, пожалуйста, покажите нам свой application.conf, а также где вы его используете в приложении.   -  person maba    schedule 13.09.2013
comment
Обновленный вопрос. На сервере установлено HOSTNAME, в application.conf ничего особенного, кроме попытки установить переменную конфигурации host.name.   -  person tysonjh    schedule 13.09.2013
comment
FWIW Я только что наткнулся на это же досадное несоответствие между документами и фактической реализацией. Если я правильно помню, то же самое было и несколько лет назад. Может быть, ребята из Typesafe забросили проект Typesafe Config?   -  person eirirlar    schedule 19.11.2015


Ответы (3)


Похоже, решение передает имя хоста через системное свойство как -Dhost.name=$HOSTNAME или -Dhost.name=$(hostname). Я бы предположил, что в Windows это будет что-то другое, но это работает для сред * NIX.

Если кто-то не сможет придумать что-то более чистое, это будет принятый ответ.

person tysonjh    schedule 13.09.2013
comment
Здесь происходит то, что HOSTNAME является переменной оболочки, а не переменной среды. См. stackoverflow.com/questions/3341372/ Другой способ выразить это так: HOSTNAME не экспортируется, а является внутренним процессом bash. С точки зрения низкого уровня, когда bash разветвляет дочерний процесс, он не передает неэкспортированные переменные в дочернюю среду. Практический вывод заключается в том, что вы можете решить эту проблему, выполнив export HOSTNAME перед запуском JVM. - person Havoc P; 11.01.2014

Это, вероятно, не работает, потому что $HOSTNAME на самом деле не является переменной среды:

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

Так что это должна быть какая-то другая особенная штука.

person James Ward    schedule 12.09.2013
comment
Если приложение вызывается через оболочку, эта переменная должна быть доступна. - person tysonjh; 13.09.2013
comment
Я исправлен: scala> System.getenv("HOSTNAME") и scala> System.getProperty("HOSTNAME") оба возвращают ноль. - person tysonjh; 13.09.2013

Вы должны увидеть, возвращает ли вызов System.getenv("HOSTNAME") ненулевое значение. Если нет, то HOSTNAME не является переменной env в соответствии со средой выполнения java, что важно для сопоставления этого со свойством конфигурации в конфигурации typesafe. Я попробовал это с HOSTNAME, и хотя я мог повторить это в bash, он не был доступен в java в качестве замены env. Я изменил его на USER и все заработало как положено.

person cmbaxter    schedule 12.09.2013
comment
Вы также правы, тест подтвердил, что HOSTNAME кажется недоступным в JVM в качестве переменной среды. Спасибо - person tysonjh; 13.09.2013