3

我正在尝试在我的应用程序中覆盖 Akka 配置。我为应用程序创建了额外的库,它也有 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 运行应用程序时,一切都很好,并且 lib 配置被覆盖。要在我的应用程序中加载配置,我正在使用简单的ConfigFactory.load()操作。但是,当我创建我的应用程序的 jarmvn clean compile assembly:single并尝试使用此命令运行它时: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>
4

3 回答 3

6

直接来自akka文档:

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

这为我解决了这个问题。

 <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>
于 2015-08-18T21:22:26.190 回答
2

据我了解,您的库应该创建名为reference.conf. 根据https://github.com/typesafehub/config

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

因此,我建议reference.conf先将 a 放入您的库中,以明确它是默认配置,并且您不需要withFallback- typesafe-config 会为您处理它。

更新:我不记得它是如何maven-assembly-plugin工作的 - 它可能将所有 jar 文件和资源组合在一个文件中,这意味着在你的情况下lib/src/main/resources/application.conf它将被覆盖app/src/main/resources/application.conf- 所以还有另一个使用reference.conf.

于 2013-09-27T14:26:37.463 回答
1

这是正确的!只是为了添加与该 reference.conf 相关的更多信息,我会说您应该转到:Akka 文档:http ://akka.io/docs/?_ga=1.90177882.150089464.1402497958 ,选择您正在使用的版本并在其中查找该页面内的 General->Configuration 查找“参考配置列表”,这就是该 reference.conf 可能需要的所有内容。就我而言,我只是复制了所有内容。

希望它有助于节省一些时间!

于 2014-08-12T08:29:25.353 回答