我有一个从conf.property文件中加载属性的代码。是否有更好的选择来加载所有属性并将其存储在例如地图?当前的方法强制为每个其他属性添加一行代码。
import java.io.File
object SomeObject {
// path to the property file
val path = "/src/main/resources/conf.properties"
// load configuration from file
val conf = ConfigFactory.parseFile(new File(path))
// get properties
val prDataPath = conf.getString("dataPath")
val prContainsHeader = conf.getBoolean("containsHeader").toString
val prMaxRows: Option[Int] = Try(conf.getInt("maxRows")).toOption
// more config variables here...
}
答案 0 :(得分:5)
您可以使用PureConfig
您的application.conf
prop1 = "hello"
prop2 = "okidoki"
如果像您的示例中那样加载,则它应该可以工作(我尚未测试):
import pureconfig.generic.auto._
loadConfig[Map[String, String](conf)
您还可以创建一个代表您的配置的case class
。
您的示例:
case class MyConfig(dataPath: String, containsHeader: Boolean, maxRows: Option[Int])
答案 1 :(得分:2)
您可以使用json。只需确保您的属性文件为json格式即可。
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import scala.io._
val json = Source.fromFile("/src/main/resources/conf.properties")
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val parsedJson = mapper.readValue[Map[String, Object]](json.reader())
答案 2 :(得分:1)
您可以使用HotReload库将conf文件转换为案例类https://github.com/gekomad/hot-reload。 有两种模式:可变模式和不可变模式。第一个创建一个配置器,该配置器在修改原始conf文件(自动热重载)时修改参数。 第二个允许您创建一个配置器,该配置器在修改原始conf文件时不会更改。
case class FooConfig(bar: String, baz: Option[Int], list: List[Int], missingValue: Option[String])
file /path/conf1.conf:
{
bar = "hello",
baz = 1,
list = [1, 1, 111]
}
import com.github.gekomad.hotreload.core.HotReload
val hr: Try[HotReload[FooConfig]] = HotReload[FooConfig]("/path/conf1.conf")
hr match {
case Success(fooConfig) => {
assert(fooConfig.currentConf == FooConfig("conf_1", Some(1), List(1, 11, 111), None))
assert(fooConfig.currentConf.bar == conf1.bar)
..
..