Configuration Akka配置覆盖

Configuration Akka配置覆盖,configuration,akka,maven-assembly-plugin,Configuration,Akka,Maven Assembly Plugin,我正在尝试覆盖应用程序中的Akka配置。我已经为应用程序创建了额外的lib,它还包含application.conf文件,因为它使用Akka。所以我有两个: application.conf in my lib: my-conf { something = 1 } application.conf in my app, which uses the lib: something-else = "foo" my-conf { something = 1000 } 当我从Intellij

我正在尝试覆盖应用程序中的Akka配置。我已经为应用程序创建了额外的lib,它还包含application.conf文件,因为它使用Akka。所以我有两个:

application.conf in my lib: 
my-conf {
 something = 1
}

application.conf in my app, which uses the lib:
something-else = "foo"
my-conf {
 something = 1000
}
当我从Intellij Idea运行应用程序时,一切正常,库配置被覆盖。要在我的应用程序中加载配置,我使用简单的
ConfigFactory.load()
操作。 但是,当我使用
mvn clean compile assembly:single
创建我的应用程序的jar并尝试使用以下命令运行它时:
java-Xmx4048m-XX:MaxPermSize=512M-Xss256K-classpath myApp.jar com.myApp.example.MyMain
我得到错误:

Caused by: com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'something-else'
因此,我决定在我的应用程序中重命名conf文件,并以如下方式加载它:

  val defConfig = ConfigFactory load
  val myConfig = ConfigFactory load "myconf"
  val combined = myConfig.withFallback(defConfig)
  val config = ConfigFactory load combined
它发现缺少设置,但不幸的是,我的应用程序中的配置并没有覆盖我库中的配置。 在我的库中,我以默认方式加载配置:
val settings=ConfigFactory load
另外,“my-conf.something”是一个重要的设置,我想从我的应用程序中覆盖它

我做错了什么?提前谢谢

此外,我认为如何创建jar可能存在一个问题:

<plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.myapp.example.MyMain</mainClass>
                    </manifest>
                </archive>
                <finalName>loadtest</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>dist-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>assembly</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

maven汇编插件
2.4
com.myapp.example.MyMain
负荷试验
假的
带有依赖项的jar
区议会
包裹
装配

据我所知,您的库应该创建名为
reference.conf的文件。根据:

库应使用应用程序提供的
Config
实例(如果有), 如果未提供特殊配置,请使用
ConfigFactory.load()
。 库应该将它们的默认值放在 类路径

因此,我建议首先将
reference.conf
放入您的库中,以明确它是默认配置,并且您不需要使用带有回退功能的
-类型安全配置将为您处理它


更新:我不记得
maven汇编插件是如何工作的-它可能将所有jar文件和资源合并到一个文件中,这意味着在您的情况下,
lib/src/main/resources/application.conf
将被
app/src/main/resources/application.conf
覆盖-所以使用
reference.conf
的另一个原因是正确的!为了添加更多关于reference.conf的信息,我建议您访问: Akka文件: ,选择您正在使用的版本,并在其中查找常规->配置 在该页面中查找“引用配置列表”,这是该Reference.conf可能需要的所有内容。就我而言,我只是把它全部复制了下来


希望它有助于节省时间

直接来自akka文档:

如果您使用Maven打包应用程序,还可以利用Apache Maven Shade插件对资源转换器的支持将构建类路径上的所有reference.conf合并为一个

这为我解决了这个问题

 <transformers>
  <transformer
   implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
   <resource>reference.conf</resource>
  </transformer>
  <transformer
   implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
   <manifestEntries>
    <Main-Class>akka.Main</Main-Class>
   </manifestEntries>
  </transformer>
</transformers>

reference.conf
阿克卡,梅因

我明白你的意思,我觉得自己是瞎子,因为我在文档中漏掉了这些行。但由于某些原因,打包后我收到错误:
,原因是:com.typesafe.config.ConfigException$丢失:找不到密钥“akka.version”的配置设置。
。这意味着,我的lib没有看到akka default conf或类似的东西。无论如何,我找到了另一个解决方案(我认为这很难看):如果lib conf将保持application.conf,我将使用
java-Dconfig.file=application.conf…
,运行我的jar,一切都会正常工作。如果我的更新是正确的,那么另一个依赖项的
reference.conf
可能会覆盖
akka-actor
reference.conf
——即来自akka-testkit、spray-can或任何其他使用类型安全配置库的库。我会调查的。当您使用IDE在非组装模式下运行时,我相信情况就是这样。我完全同意您的看法,这是正确的方法。顺便说一下,你举了一些很好的例子,我来看看喷雾罐,也许我会发现我做错了什么。另外,我将查看汇编插件文档,可能我遗漏了一些内容。谢谢。你显示的加载配置的代码片段看起来很奇怪:
组合的
应该是你想要的,你用
配置
干什么?根据Akka配置文档的例子,他们使用
完成
配置
在我的例子中)来构建ActorSystem:
//将结果放在覆盖之间//(系统道具)并再次默认Config complete=ConfigFactory.load(组合);//创建ActorSystem ActorSystem=ActorSystem.create(“myname”,complete);
link:在您的示例中,此“三明治”已经发生了两次。重读您的帖子表明您实际上没有在lib中使用如上所示的派生配置,正如您所说的lib在内部使用
ConfigFactory.load()
;这将是您的问题。