WebエンジニアのLoL日記

LoLをプレイしたりLJLの試合を見たりするのが好きなエンジニア。LoLのイベントやパッチノートなど気になった点を記事にしたり、LJLについの記事をかいたりしています。某社でWeb系のエンジニアとして働いているので、技術系の記事もたまに書きます。コンタクトを取りたい場合はtwitterまで。

Scala の typesafe config がいい感じに applicatoon.conf を読んでくれない

typesafe config について

typesafe config とは、Play Framework でも採用されている便利な config ライブラリである。

github.com

typesafe config の使い方について

READMEを見ると以下のような記述がある

The convenience method ConfigFactory.load() loads the following (first-listed are higher priority):

- system properties
- application.conf (all resources on classpath with this name)
- application.json (all resources on classpath with this name)
- application.properties (all resources on classpath with this name)
- reference.conf (all resources on classpath with this name)

最初 application.conf を置いて ConfigFactory.load() したら大体いい感じに読んでくれるのかと思ったので、試しに src/main/scala/application.conf に以下のようなものを置いた。

token = "hogehoge"

そしてメインのコードは src/main/scala/Main.scala に置いた。

import com.typesafe.config.ConfigFactory

object Main extends App {
  println("start app")
  implicit val conf = ConfigFactory.load()
  println(conf.getString("token"))
}

ちなみに build.sbt は以下の通りだ

name := "hoge"

version := "1.0"

scalaVersion := "2.12.3"

libraryDependencies ++= Seq(
  "com.typesafe" % "config" % "1.3.1"
)

この状態で sbt run すると以下のエラーになった

com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'token'

つまり、 application.conf がうまく読み込めていなかった。

どのようなディレクトリ配置にするのが正しかったのか

結局以下のようにするのが正しかった

  • build.sbt
  • src/main/scala/Main.scala
  • src/main/resources/application.conf

このようなディレクトリ配置にしたら、 ConfigFactory.load()application.conf が読まれるようになった。

resource ではなく resources なので注意

見出しの通り。ずっと src/main/resource/application.conf に置いたりして「動かねぇな〜」ってめっちゃ迷っていた。 applicatons ! 複数形なので注意が必要だ。

Scalaスケーラブルプログラミング第3版

Scalaスケーラブルプログラミング第3版