Typesafe Config の設定ファイルを sbt run 時に指定したく、"-Dconfig.file=develo.conf" の指定時に
嵌った・・・
System properties の切り替えのみの構成で、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ./
|
+--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
1 2 3 4 5 | name := "sampleconfig"
lazy val sampleconfig 1 = project
lazy val sampleconfig 2 = project
|
./project/build.properties
./sampleconfig1/build.sbt
./sampleconfig2/build.sbt
./sampleconfig1/src/main/scala/SampleConfig1.scala
1 2 3 | object SampleConfig 1 extends Application {
println( "SampleConfig1: " + System.getProperty( "config.file" ))
}
|
./sampleconfig2/src/main/scala/SampleConfig2.scala
1 2 3 | object SampleConfig 2 extends Application {
println( "SampleConfig2: " + System.getProperty( "config.file" ))
}
|
まずは sammpleconfig1 から、引数指定で試す。
1 2 3 4 | > project sampleconfig1
> run -Dconfig. file =sampleconfig1.conf
SampleConfig1: null
|
取れない・・・
つぎに、javaOptions を指定。
./sampleconfig1/build.sbt
1 2 3 | name := "sampleconfig1"
javaOptions in Runtime + = "-Dconfig.file=sampleconfig1.conf"
|
取れない・・・
ぐぐってみると、initialize を使ってる
書き込みがあったので使用してみる。
./sampleconfig1/build.sbt
1 2 3 4 5 6 | name := "sampleconfig1"
initialize ~ = { _ = >
if ( new java.io.File( "sampleconfig1.conf" ).exists)
System.setProperty( "config.file" , "sampleconfig1.conf" )
}
|
1 2 3 4 | > project sampleconfig1
> run
SampleConfig1: sampleconfig1.conf
|
おっ取れてる!
うまくいったということで暫くこれでやっていたが、設定ファイルが
読めない時が・・・
実は initialize を使用した後に、sampleconfig2 のプロジェクトを追加していて
./sampleconfig2/build.sbt
1 2 3 4 5 6 | name := "sampleconfig2"
initialize ~ = { _ = >
if ( new java.io.File( "sampleconfig2.conf" ).exists)
System.setProperty( "config.file" , "sampleconfig2.conf" )
}
|
1 2 3 4 | > project sampleconfig2
> run
SampleConfig2: sampleconfig2.conf
|
この時点では取れているのだが、再度 sampleconfig1 を実行すると
1 2 3 4 | > project sampleconfig1
> run
SampleConfig1: sampleconfig2.conf
|
と他のプロジェクトの設定が
取れてしまっていた・・・
なので実行前に設定するタスクを入れることに。
./sampleconfig1/build.sbt
1 2 3 4 5 6 7 8 9 10 | 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
1 2 3 4 5 6 7 8 9 10 | 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)
|
1 2 3 4 5 6 7 | > project sampleconfig1
> run
SampleConfig1: sampleconfig1.conf
> project sampleconfig2
> run
SampleConfig2: sampleconfig2.conf
|
これでうまくいった
in Compile を in Runtime にすると
うまくいかない・・・難しい・・・