Cómo leer variables de entorno en Scala

158

En Java, la lectura de variables de entorno se realiza con System.getenv().

¿Hay alguna manera de hacer esto en Scala?

bombilla de verano
fuente

Respuestas:

232

Desde Scala 2.9 puede usar sys.envpara el mismo efecto:

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

Creo que es bueno usar la API Scala en lugar de Java. Actualmente hay varios proyectos para compilar Scala en otras plataformas que no sean JVM (.NET, javascript, nativo, etc.) La reducción de las dependencias en la API de Java hará que su código sea más portátil.

paradigmático
fuente
96
Probablemente sea una mejor práctica usar lo sys.env.get("VARIABLE")que le dará Option[String]un error en lugar de arrojar un error si falta esa variable.
Cristian Vrabie
44
@CristianVrabie Yo también lo preferiría, en la mayoría de los casos. Pero sys.enves solo un Map. Puedes hacer cualquier método que sea apropiado para ti.
paradigmático
3
sys.env.getOrElse("VARIABLE", "default value")También fue útil en mi caso donde la variable de entorno puede no estar definida.
Josh Peak
131

Hay un objeto:

scala.util.Properties

Esto tiene una colección de métodos que se pueden utilizar para obtener información del entorno, incluyendo

scala.util.Properties.envOrElse("HOME", "/myhome" )
andy
fuente
3
También preferiría Propiedades. Permite recuperar los opcionales y tiene nombres para las propiedades de uso común.
ppopoff
25

Mismo camino:

scala> System.getenv("HOME")
res0: java.lang.String = /Users/dhg
dhg
fuente
Ahora que uso Scala a diario, debo mover la respuesta aceptada a la respuesta de @ paradigmatic. Utiliza Scala API y, si se usa como se sugiere en los comentarios, puede devolver una Opción.
summerbulb
11

Usando directamente un valor predeterminado con getOrElsesobre el sys.envMapa ( val myenv: Map[String, String] = sys.env):

sys.env.getOrElse(envVariable, defaultValue)

Obtiene el contenido de envVariableo, si no existe, el defaultValue.

victe
fuente
0

Para imprimir todas las variables de entorno, puede usar

System.getenv.forEach((name, value) => println(s"$name: $value"))
Matthias Braun
fuente
1
error: missing parameter typeen los argumentos si solo copia y pega esto.
Thundergolfer
@thundergolfer: Actualmente no tengo Scala instalado en mi máquina. ¿Te diste cuenta de lo que faltaba?
Matthias Braun
Después de cambiar los parámetros a (name: String, value: String), estoy obteniendo error: type mismatch; found : (String, String) => Unit required: java.util.function.BiConsumer[_ >: String, _ >: String].
Roland Weber
1
Aquí hay algo que funciona, pero requiere una importación: alvinalexander.com/scala/…
Roland Weber