如何覆盖包含的文件中的配置设置

我在application.conf中定义了一些akka远程设置:

akka {
    actor {
        provider = "akka.remote.RemoteactorRefProvider"
        warn-about-java-serializer-usage = false
    }
    remote {
        enabled-transports = ["akka.remote.netty.tcp"]
        netty.tcp {
            hostname = "myhost"
            port = 2561
            maximum-frame-size = 256000b
        }
    }
}

但是随后我有另一个程序需要从application.conf中访问其他配置设置。但是我需要忽略akka配置设置。因此,我在第二个程序中尝试了以下操作:

include "application"

akka {}

但是application.conf的akka​​设置仍在应用。我知道这一点是因为即使在我的第二个应用程序中不应该存在远程Akka的情况下,我也会在Akka端口上获得绑定异常

对我来说,从我的application.conf中清除/忽略akka配置设置的最佳方法是什么?

iCMS 回答:如何覆盖包含的文件中的配置设置

经过一些试验,最好的选择是将IMO排除在application.conf之外,以便将常用设置放在自己的conf文件中。

因此,您可以将常用设置放入common-settings.conf中,然后在Akka应用程序中使用

include "common-settings"

akka {
  // Akka settings here
}

其他需要common-settings的模块可以放在它们的application.conf中:

include "common-settings"

这对于使用多模块构建可能会更好。如果它们是相同的,例如sbt模块,那么您可能会用application.confakka-application.conf替换规范的other-application.conf并将您的ActorSystem设置代码指向{{ 1}}而不是akka-application.conf(在这种情况下可能不应该存在,因为您希望裸application.conf调用很快就会失败(这里的替代方法是让不同的程序来争夺谁拥有的所有权) ConfigFactory.load()

,

您面临的问题实际上是设计使然。来自HOCON first page documentation

允许重复的密钥;稍后的值将覆盖较早的值,但对象值的键将两个对象以递归方式合并

因此,当您在第二个文件中添加akka {}时,它只是被合并而不会被覆盖。

据我所见,您有2个选择。

  1. 复制配置,并用实际需要的属性覆盖所有属性。这意味着,在第二个程序中,您可以添加:

    akka {
        actor {
            provider = "new value"
            warn-about-java-serializer-usage = false
        }
        remote {
            enabled-transports = ["completely new values"]
            netty.tcp {
                hostname = "etc..."
                port = 2561
                maximum-frame-size = 256000b
            }
        }
    }
    
  2. 另一个我不太喜欢的选项是覆盖名为akka的对象。为此,您需要为其分配不是对象的内容。否则它将被合并。例如,如果您添加第二个程序akka=4,则它将完全删除所有其他值。 但是!在这种情况下,您需要使用程序来处理那些缺少的属性。这意味着,在代码的某个地方,您将必须编写类似的内容(不要忘记config会丢失):

    Try(config.getString("akka.actor.provider")).getOrElse(Do something here)
    

    您必须这样做,因为现在akka是一个字符串,您无法将其作为对象来查看。

,

假设您要覆盖another.conf中的akka​​.remote.netty.tcp.port,您只需

include "application.conf"

akka.remote.netty.tcp.port = 2562

它将覆盖netty tcp端口,而其余部分保持不变并继承

本文链接:https://www.f2er.com/1674666.html

大家都在问