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

158

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

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

summerbulb
источник

Ответы:

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
DHG
источник
Теперь, когда я использую Scala ежедневно, я должен переместить принятый ответ в ответ @ paradigmatic. Он использует Scala API и при использовании в соответствии с рекомендациями в комментариях может вернуть Option.
летняя лампочка
11

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

sys.env.getOrElse(envVariable, defaultValue)

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

victe
источник
5

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

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

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

jfuentes
источник
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/…
Роланд Вебер