Как читать переменные окружения в Scala


158

В Java чтение переменных среды выполняется с помощью System.getenv().

Есть ли способ сделать это в Scala?

Ответы:


232

Начиная с Scala 2.9 вы можете использовать sys.envдля того же эффекта:

scala> sys.env("HOME")
res0: String = /home/paradigmatic

Я думаю, что хорошо использовать Scala API вместо Java. В настоящее время существует несколько проектов по компиляции Scala для других платформ, отличных от JVM (.NET, javascript, native и т. Д.). Сокращение зависимостей от Java API сделает ваш код более переносимым.


96
Вероятно, лучше использовать эту методику, sys.env.get("VARIABLE")которая даст вам Option[String]ошибку, а не выдаст ошибку, если эта переменная отсутствует.
Кристиан Враби

4
@CristianVrabie Я бы тоже предпочел это, в большинстве случаев. Но sys.envэто просто Map. Вы можете любой метод подходит для вас.
парадигма

3
sys.env.getOrElse("VARIABLE", "default value")было также полезно в моем случае, когда переменная окружения не может быть определена.
Джош Пик

131

Есть объект:

scala.util.Properties

у этого есть набор методов, которые могут использоваться, чтобы получить информацию об окружающей среде, включая

scala.util.Properties.envOrElse("HOME", "/myhome" )

3
Я также предпочел бы свойства. Он позволяет получить дополнительные данные и имеет имена для часто используемых свойств.
ppopoff

25

Так же:

scala> System.getenv("HOME")
res0: java.lang.String = /Users/dhg

Теперь, когда я использую Scala ежедневно, я должен переместить принятый ответ в ответ @ paradigmatic. Он использует Scala API и при использовании в соответствии с рекомендациями в комментариях может вернуть Option.
летняя лампочка

11

Использование непосредственно по умолчанию с getOrElseнад sys.envMap ( val myenv: Map[String, String] = sys.env):

sys.env.getOrElse(envVariable, defaultValue)

Вы получаете содержание , envVariableили, если он не существует, то defaultValue.


5

Если используется библиотека конфигурации Lightbend (по умолчанию в Play2 и Akka), вы можете использовать

foo = "default value" foo = ${?VAR_NAME}

синтаксис для переопределения foo, если существует переменная окружения VAR_NAME. Более подробная информация в https://github.com/typesafehub/config#optional-system-or-env-variable-overrides


0

Чтобы распечатать все переменные среды, вы можете использовать

System.getenv.forEach((name, value) => println(s"$name: $value"))

1
error: missing parameter typeна аргументы, если вы просто скопируйте и вставьте это.
Thundergolfer

@thundergolfer: в настоящее время на моей машине не установлена ​​Scala. Вы выяснили, чего не хватало?
Матиас Браун

После изменения параметров (name: String, value: String)я получаю error: type mismatch; found : (String, String) => Unit required: java.util.function.BiConsumer[_ >: String, _ >: String].
Роланд Вебер

1
Вот что работает, но требует импорта: alvinalexander.com/scala/…
Роланд Вебер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.