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 にするとうまくいかない・・・難しい・・・