Magnolia Tech

いつもコードのことばかり考えている人のために。

Scalaで環境変数を参照する方法

sys.envを使う

sys.envという関数が用意されていて、実態はSystem.getenv()ScalaのMapのインタフェースで包んだものが得られます。immutableなので、書き換えることはできません。

存在しない環境変数を参照と例外が送出されますので、参照する際はgetOrElseでデフォルト値を必ず与えておくと良いでしょう。

短いので、Scala 2.13のソースコードをそのまま貼り付けてしまいます。

  def env: Map[String, String] = Map.from(System.getenv().asScala).withDefault { v =>
    val s = System.getenv(v)
    if (s == null) throw new NoSuchElementException(v)
    s
  }

scala.util. Propertiesを使う

Mapとして丸っとコピーするには環境変数は大きいので、必要な物だけアクセスすればいいのでは?ということで、scala.util.Propertiesに、envOrElse関数が用意されてます。

これも短いので、該当箇所をまるっと貼り付けてしまいますが、以下のようなコードになっています。

  def envOrElse(name: String, alt: => String)   = Option(System getenv name) getOrElse alt

sys.envの方がタイプ数が短いのだけど、若干「なんかScalaっぽくない」感じがするので、scala.util. Propertiesを使った方が好みです。また、ScalaJDKのバージョン取得用のメソッドが用意されていたりと、便利なメソッドが用意されているので、scala.util. Propertiesのメソッドは一通り見ておくと良いかも。