In Java, reading environment variables is done with System.getenv().
Is there a way to do this in Scala?
Since Scala 2.9 you can use sys.env for the same effect:
scala> sys.env("HOME")
res0: String = /home/paradigmatic
I think is nice to use the Scala API instead of Java. There are currently several project to compile Scala to other platforms than JVM (.NET, javascript, native, etc.) Reducing the dependencies on Java API, will make your code more portable.
sys.env.get("VARIABLE") which will give you an Option[String] rather than throw an error if that variable is missing.sys.env is just a Map. You can whatever method is appropriate for you.sys.env.getOrElse("VARIABLE", "default value") was also helpful in my case where the environment variable may not be defined.There is an object:
scala.util.Properties
this has a collection of methods that can be used to get environment info, including
scala.util.Properties.envOrElse("HOME", "/myhome" )
Same way:
scala> System.getenv("HOME")
res0: java.lang.String = /Users/dhg
If Lightbend's configuration library is used (by default in Play2 and Akka) then you can use
foo = "default value"
foo = ${?VAR_NAME}
syntax to override foo if an environment variable VAR_NAME exist. More details in https://github.com/typesafehub/config#optional-system-or-env-variable-overrides
To print all environment variables, you can use
System.getenv.forEach((name, value) => println(s"$name: $value"))
error: missing parameter type on the args if you just copy-paste this.(name: String, value: String), I'm getting error: type mismatch; found : (String, String) => Unit required: java.util.function.BiConsumer[_ >: String, _ >: String].sys.env.foreach(tuple => println(s"$tuple")) is not as elegant but seems to get the job done.You can use sys.props.getOrElse("key", "default") for Java systems properties.
package scala
object sys {
/** A bidirectional, mutable Map representing the current system Properties.
*
* @return a SystemProperties.
* @see [[scala.sys.SystemProperties]]
*/
def props: SystemProperties = new SystemProperties
/** An immutable Map representing the current system environment.
*
* @return a Map containing the system environment variables.
*/
def env: immutable.Map[String, String] = immutable.Map(System.getenv().asScala.toSeq: _*)