3

アプリケーションで Akka 構成を上書きしようとしています。アプリケーション用に追加のライブラリを作成しました。これには、Akka を使用するため、application.conf ファイルも含まれています。だから私はそれらのうちの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()操作を使用しています。しかし、アプリの jar を作成し、次のmvn 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.conf を 1 つにマージすることもできます。

これで問題は解決しました。

 <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.confhttps://github.com/typesafehub/configによると:

ライブラリはConfig、アプリが提供するインスタンスがあればそれを使用しConfigFactory.load()、特別な構成が提供されていない場合はそれを使用する必要があります。ライブラリは、デフォルトをreference.confクラスパスの a に配置する必要があります。

したがって、最初に areference.confをライブラリに入れることをお勧めします。これは、それがデフォルトの構成であることを明確にするwithFallbackためです。

更新:どのように機能するか覚えていません-すべてのjarファイルとリソースを単一のファイルに結合する可能性があります。maven-assembly-pluginつまり、あなたの場合はlib/src/main/resources/application.conf上書きされます..app/src/main/resources/application.confreference.conf

于 2013-09-27T14:26:37.463 に答える
1

それは正しい!その reference.conf に関連する情報をもう少し追加するには、Akka のドキュメント: http://akka.io/docs/?_ga=1.90177882.150089464.1402497958 にアクセスして、使用しているバージョンを選択してください。そのページ内で General->Configuration を探し、「Listing of the Reference Configuration」を探します。これが、その reference.conf に必要なすべてのコンテンツです。私の場合は、すべてコピーしました。

いつか節約に役立つことを願っています!

于 2014-08-12T08:29:25.353 に答える