2013-09-27 3 views
3

Я пытаюсь перезаписать конфигурацию Akka в своем приложении. Я создал дополнительную lib для приложения, у которого также есть файл application.conf, поскольку он использует Akka. Поэтому у меня есть 2 из них:Конфигурация 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(). Но когда я создаю баночку моего приложения с 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' 

Поэтому я решил переименовать файл конф в моем приложении и загрузить его в таком путь:

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» является важной настройкой, и я бы хотел перезаписать ее из своего приложения.

Что я делаю неправильно? Заранее спасибо!

Кроме того, я думал, что может быть проблема, как я создаю банку:

<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> 
+0

Фрагмент, который вы показываете для загрузки своей конфигурации, выглядит странно: 'comb' должен быть тем, который вы хотите, для чего вы используете' config' для? –

+1

В соответствии с примером документации Akka Configuration они используют 'complete' (' config' в моем случае) для сборки ActorSystem: '// помещаем результат между переопределениями // (системные реквизиты) и значения по умолчанию снова Конфигурация завершена = ConfigFactory.load (в сочетании); // создать ActorSystem ActorSystem системы = ActorSystem.create ("MyName", в комплекте); ' ссылка: http://doc.akka.io/docs/akka/snapshot/general/configuration.html – psisoyev

+0

В вашей Например, это «сэндвич» уже произошло дважды. Повторная запись вашего сообщения предполагает, что вы фактически не используете конфигурацию, созданную, как показано выше, в вашей lib, поскольку вы говорите, что lib использует 'ConfigFactory.load()' внутренне; это будет вашей проблемой. –

ответ

2

Насколько я понимаю, ваша библиотека должна создать файл с именем reference.conf. По https://github.com/typesafehub/config:

libraries should use a Config instance provided by the app, if any, and use ConfigFactory.load() if no special Config is provided. Libraries should put their defaults in a reference.conf on the classpath.

Итак, я предлагаю положить reference.conf в библиотеку первым, чтобы понять, что это по умолчанию конфигурации, и вам не нужно будет иметь withFallback - типизированный-конфига будет обрабатывать его для тебя.

Update: Я не помню, как maven-assembly-plugin работы - это может объединить все баночки файлов и ресурсы в одном файле, а это означает, что lib/src/main/resources/application.conf будет перезаписаны app/src/main/resources/application.conf в вашем случае - так еще одна причины, чтобы использовать reference.conf ,

+0

Я вижу вашу точку зрения, и я чувствую слепоту, что я пропустил эти строки в документации. Но по какой-то причине после упаковки я получаю сообщение об ошибке: 'Caused by: com.typesafe.config.ConfigException $ Отсутствует: настройки конфигурации для ключа 'akka.version'' отсутствуют. Это означает, что мой lib не видит конфиг akka default или что-то в этом роде. В любом случае, я нашел другое решение (которое, как мне кажется, уродливо): if lib conf останется application.conf, и я запустил свой jar с помощью java -Dconfig.file = application.conf ... '- все работает так, как должно быть. Попробуем сделать это правильно с вашим решением. – psisoyev

+0

Итак, если мое обновление верно, то 'reference.conf'' akka-actor' может быть перезаписан другими ссылками 'reference.conf' - то есть из akka-testkit , или распылитель, или любую другую библиотеку, которая использует библиотеку typesafe-config. Я бы посмотрел на это. Поскольку вы работаете в не собранном режиме, используя IDE просто отлично, я считаю, что это так. – abatyuk

+0

Я полностью согласен с вами, это правильный подход. Кстати, вы дали хорошие примеры, я посмотрю на брызги, может ли я найду то, что я делаю неправильно. Кроме того, я просмотрю документы плагина сборки, возможно, я пропустил sometihng. Благодарю. – psisoyev

1

Правильно! Просто чтобы добавить немного больше информации, связанной с этим reference.conf, я бы сказал, что вы должны пойти по адресу: Akka Документация: http://akka.io/docs/?_ga=1.90177882.150089464.1402497958 , выберите версию, которую вы используете, и в ней найдите General-> Configuration внутри этой страницы найдите «Список ссылочной конфигурации», это весь контент, который может понадобиться для этого reference.conf. В моем случае я просто скопировал все это.

Надеюсь, это поможет сэкономить когда-нибудь!

4

Прямо из Акки документации:

Если вы используете Maven, чтобы упаковать приложение, вы можете также использовать поддержку Shade плагин Apache Maven для ресурсов Трансформаторы объединить все reference.confs от комплекции classpath в один.

Это разрешило проблему для меня.

<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> 
Смежные вопросы