Como ler variáveis ​​de ambiente no Scala

158

Em Java, a leitura de variáveis ​​de ambiente é feita com System.getenv().

Existe uma maneira de fazer isso no Scala?

lâmpada de verão
fonte

Respostas:

232

Desde o Scala 2.9, você pode usar sys.envo mesmo efeito:

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

Eu acho que é bom usar a API Scala em vez de Java. Atualmente, existem vários projetos para compilar o Scala em outras plataformas além da JVM (.NET, javascript, nativo etc.) Reduzir as dependências da API Java, tornará seu código mais portátil.

paradigmático
fonte
96
Provavelmente, é uma prática melhor usar, o sys.env.get("VARIABLE")que causará Option[String]um erro, em vez de gerar, se essa variável estiver ausente.
Cristian Vrabie
4
@CristianVrabie Eu também preferiria, na maioria dos casos. Mas sys.envé apenas um Map. Você pode qualquer método que seja apropriado para você.
24913 paradigmático
3
sys.env.getOrElse("VARIABLE", "default value")também foi útil no meu caso em que a variável de ambiente pode não estar definida.
Josh Peak
131

Existe um objeto:

scala.util.Properties

isso possui uma coleção de métodos que podem ser usados ​​para obter informações sobre o ambiente, incluindo

scala.util.Properties.envOrElse("HOME", "/myhome" )
andy
fonte
3
Eu também preferiria Propriedades. Ele permite recuperar opcionais e possui nomes para propriedades comumente usadas.
ppopoff
25

Da mesma maneira:

scala> System.getenv("HOME")
res0: java.lang.String = /Users/dhg
dhg
fonte
Agora que uso Scala diariamente, devo mover a resposta aceita para a resposta da @ paradigmatic. Ele usa a API Scala e, se usado como sugerido nos comentários, pode retornar uma opção.
summerbulb
11

Usando diretamente um padrão com getOrElseover the sys.envMap ( val myenv: Map[String, String] = sys.env):

sys.env.getOrElse(envVariable, defaultValue)

Você obtém o conteúdo do envVariableou, se não existir, o defaultValue.

victe
fonte
0

Para imprimir todas as variáveis ​​de ambiente, você pode usar

System.getenv.forEach((name, value) => println(s"$name: $value"))
Matthias Braun
fonte
1
error: missing parameter typenos argumentos se você apenas copiar e colar isso.
Thundergolfer 16/04/19
@ thundergolfer: Atualmente, não tenho o Scala instalado na minha máquina. Você descobriu o que estava faltando?
Matthias Braun
Depois de alterar os parâmetros para (name: String, value: String), estou recebendo error: type mismatch; found : (String, String) => Unit required: java.util.function.BiConsumer[_ >: String, _ >: String].
Roland Weber
1
Aqui está algo que funciona, mas requer uma importação: alvinalexander.com/scala/…
Roland Weber