Typesafe Config の設定ファイルを sbt run 時に指定したく、"-Dconfig.file=develo.conf" の指定時に
嵌った・・・
System properties の切り替えのみの構成で、
./
|
+--build.sbt
|
+--project
| |
| +--build.properties
|
+--sampleconfig1
| |
| +--build.sbt
| |
| +--src
| |
| +--main
| |
| +--scala
| |
| +--SampleConfig1.scala
|
+--sampleconfig1.conf
|
+--sampleconfig2
| |
| +--build.sbt
| |
| +--src
| |
| +--main
| |
| +--scala
| |
| +--SampleConfig2.scala
|
+--sampleconfig2.conf
./build.sbt
name := "sampleconfig"
lazy val sampleconfig1 = project
lazy val sampleconfig2 = project
./project/build.properties
sbt.version=0.13.8
./sampleconfig1/build.sbt
name := "sampleconfig1"
./sampleconfig2/build.sbt
name := "sampleconfig2"
./sampleconfig1/src/main/scala/SampleConfig1.scala
object SampleConfig1 extends Application {
println("SampleConfig1: " + System.getProperty("config.file"))
}
./sampleconfig2/src/main/scala/SampleConfig2.scala
object SampleConfig2 extends Application {
println("SampleConfig2: " + System.getProperty("config.file"))
}
まずは sammpleconfig1 から、引数指定で試す。
# sbt
> project sampleconfig1
> run -Dconfig.file=sampleconfig1.conf
SampleConfig1: null
取れない・・・
つぎに、javaOptions を指定。
./sampleconfig1/build.sbt
name := "sampleconfig1"
javaOptions in Runtime += "-Dconfig.file=sampleconfig1.conf"
取れない・・・
ぐぐってみると、initialize を使ってる
書き込みがあったので使用してみる。
./sampleconfig1/build.sbt
name := "sampleconfig1"
initialize ~= { _ =>
if (new java.io.File("sampleconfig1.conf").exists)
System.setProperty("config.file", "sampleconfig1.conf")
}
# sbt
> project sampleconfig1
> run
SampleConfig1: sampleconfig1.conf
おっ取れてる!
うまくいったということで暫くこれでやっていたが、設定ファイルが
読めない時が・・・
実は initialize を使用した後に、sampleconfig2 のプロジェクトを追加していて
./sampleconfig2/build.sbt
name := "sampleconfig2"
initialize ~= { _ =>
if (new java.io.File("sampleconfig2.conf").exists)
System.setProperty("config.file", "sampleconfig2.conf")
}
# sbt
> project sampleconfig2
> run
SampleConfig2: sampleconfig2.conf
この時点では取れているのだが、再度 sampleconfig1 を実行すると
# sbt
> project sampleconfig1
> run
SampleConfig1: sampleconfig2.conf
と他のプロジェクトの設定が
取れてしまっていた・・・
なので実行前に設定するタスクを入れることに。
./sampleconfig1/build.sbt
name := "sampleconfig1"
val setProperty = TaskKey[Unit]("setProperty") in Compile
setProperty := {
if (new java.io.File("sampleconfig1.conf").exists)
System.setProperty("config.file", "sampleconfig1.conf")
}
run in Compile <<= run in Compile dependsOn (setProperty)
./sampleconfig2/build.sbt
name := "sampleconfig2"
val setProperty = TaskKey[Unit]("setProperty") in Compile
setProperty := {
if (new java.io.File("sampleconfig2.conf").exists)
System.setProperty("config.file", "sampleconfig2.conf")
}
run in Compile <<= run in Compile dependsOn (setProperty)
# sbt
> project sampleconfig1
> run
SampleConfig1: sampleconfig1.conf
> project sampleconfig2
> run
SampleConfig2: sampleconfig2.conf
これでうまくいった
in Compile を in Runtime にすると
うまくいかない・・・難しい・・・