【问题标题】:Typesafe config loads wrong configurationTypesafe config 加载错误的配置
【发布时间】:2018-12-23 22:54:09
【问题描述】:

所以问题真的很简单,我希望解决方案也是如此。

所以基本上我有两个配置文件application.conf 和dev.conf。我正在像sbt -Dconfig.file=dev.conf 这样的命令行传递我的配置文件。

问题是当我从主对象(extends App)中使用ConfigFactory.load 时,它会加载我通过命令行传递的配置(在本例中为dev.conf),但是当我从不同对象加载配置时加载默认application.conf。

我可以加载从任何对象的参数传递的配置吗?

【问题讨论】:

  • 不清楚在这两种情况下如何运行您的应用程序。您可能知道,无论表面上是如何完成的,它都归结为启动 JVM 的 java -cp classpath your.SomeClass 调用。只要将config.file系统属性设置为dev.conf,通常通过java二进制文件(java -Dconfig.file=dev.conf)的命令行参数,在哪里调用ConfigFactory.load()并不重要,因为系统属性将在整个应用程序中保持相同,因为它是一个全局状态。
  • 我的意思是,将系统属性正确传递给应用程序很重要,因为这是它可以为一个主类工作而另一个主类失败的唯一原因。
  • 在这两种情况下我都运行应用程序sbt -Dconfig.file="dev.conf",然后在sbt内部我使用runMain ...

标签: scala typesafe-config


【解决方案1】:

当您使用runMain SBT 任务运行应用程序时,by default SBT 不会为您的代码创建单独的 JVM。这会对应用程序生命周期产生多种影响,当然还有系统属性。

一般来说,您的方法应该有效,只要您的构建配置不启用forking。但是,我认为更好的方法是实际依赖分叉并明确指定系统属性。这保证有效。为此,需要将run任务中的fork设置为true,然后添加JVM命令行选项:

Compile / run / fork := true,
Compile / run / javaOptions += "-Dconfig.file=dev.conf",

之后不要忘记重新启动 SBT。使用这种方法,您不需要将 config.file 属性传递给 SBT;相反,它由javaOptions 设置控制,如上例所示。

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 2016-01-16
    • 2015-02-26
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2020-11-06
    • 2017-02-06
    • 2018-10-10
    相关资源
    最近更新 更多