我正在尝试覆盖应用程序中的 Akka 配置。我已经为应用程序创建了额外的库,该应用程序也有application.conf文件,因为它使用Akka。所以我有其中的 2 个:
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()
操作。但是当我使用 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>
直接来自 akka 文档:
如果使用 Maven 打包应用程序,还可以利用资源转换器的 Apache Maven Shade 插件支持,将构建类路径上的所有 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>
据我了解,您的库应该创建名为 reference.conf
的文件。据 https://github.com/typesafehub/config:
库应使用应用提供的
Config
实例(如果有) 如果没有提供特殊的配置,请使用ConfigFactory.load()
。 库应将其reference.conf
默认值放在 类路径。
因此,我建议先将reference.conf
放入您的库中,以明确它是默认配置,并且您不需要withFallback
- typesafe-config 将为您处理它。
更新:我不记得maven-assembly-plugin
是如何工作的 - 它可能会将所有 jar 文件和资源合并到一个文件中,这意味着在您的情况下lib/src/main/resources/application.conf
将被app/src/main/resources/application.conf
覆盖 - 所以这是使用 reference.conf
的另一个原因。
错!只是为了添加与该参考相关的更多信息.conf,我会说你应该去:阿卡文档:http://akka.io/docs/?_ga=1.90177882.150089464.1402497958,选择您正在使用的版本,然后在其中查找常规>配置在该页面中查找"参考配置列表",这是该参考可能需要的所有内容。就我而言,我只是复制了所有内容。
希望它有助于节省一些时间!