Где я должен помещать файлы конфигурации приложения для проекта Maven?

Я использую плагин Maven Application Assembler для создания автономных исполняемых файлов из моего проекта Java. Приложение читает файлы конфигурации, включая Spring файлы. В плагине Application Assembler есть опция (активированная по умолчанию), чтобы добавить каталог etc/в путь класса приложения, но что мне делать, чтобы плагин копировал мои файлы конфигурации в этот каталог?

Или, в общем, где находится в Maven кошерное местоположение для файлов конфигурации приложения, которые НЕ должны быть упакованы в артефакт?

Ответ 1

Вы также можете использовать фильтрацию ресурсов: http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files

включить фильтрацию:

...
<build>
...
<resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
...
</build>
...

создайте файл под src/main/resources, например: application.properties

application.properties

configprop.1=${param1}
configprop.2=${param2}

Затем настройте профиль и задайте некоторые свойства, возможно, в файле settings.xml который устанавливает различные свойства в зависимости от того, является ли это конструкцией dev или production. см. http://maven.apache.org/guides/introduction/introduction-to-profiles.html

У меня есть разные свойства, установленные в зависимости от того, является ли это сервером сборки, dev или производственным развертыванием

mvn -Denv = dev || mvn -Denv = dev-build || mvn -Denv = production

Ссылка maven имеет довольно хорошее описание.

Ответ 2

Вы можете попробовать плагин сборки maven. Я использовал его вместе с плагином appassembler.

Настройте appassembler, чтобы указать любое имя, которое вы хотите для своего каталога конфигурации, если вы не хотите "и т.д.". Плагин сборки собирает все в своем собственном выходном каталоге, поэтому я настраиваю плагин сборки, чтобы скопировать bin и repo dirs из каталога appassembler в его выходной каталог, после чего у меня есть его копия файлов конфигурации (мои находятся в src/main/config ) в ожидаемый конфигурационный каталог. В этом есть некоторое дублирование, потому что вы копируете выходы appassembler, но это меня действительно не беспокоило.

Таким образом, после выполнения плагина сборки ваш bin, repo и config dir - это все одноранговые каталоги в каталоге выходных данных сборки. Вы можете настроить его, чтобы иметь другую структуру, если хотите, я просто хотел, чтобы мое зеркало отображало структуру appassembler.

Хорошо, что вы также можете настроить плагин сборки, чтобы изменить свои двоичные файлы на исполняемые файлы, что я не мог видеть, как это сделать с appassembler. И если вы затем привязываете appassembler: сборку и сборку: одиночные цели на фазу пакета, все, что вам нужно сделать, это "mvn package", и он собирает все.

Ответ 3

Для людей, которые пришли к этому совсем недавно, есть, начиная с версии 1.1 Плагина Application Assembler, дополнительные параметры configurationSourceDirectory и copyConfigurationDirectory. Пожалуйста, найдите их в примере POM.xml ниже:

<configuration>
  <!-- Set the target configuration directory to be used in the bin scripts -->
  <configurationDirectory>conf</configurationDirectory>
  <!-- Copy the contents from "/src/main/config" to the target
      configuration directory in the assembled application -->
  <copyConfigurationDirectory>true</copyConfigurationDirectory>
  <!-- Include the target configuration directory in the beginning of
      the classpath declaration in the bin scripts -->
  <includeConfigurationDirectoryInClasspath>
    true
  </includeConfigurationDirectoryInClasspath>
...
</configuration>

Дополнительная информация здесь

Ответ 4

Я не знаю, правильно ли я вас понимаю. Но то, что я делал в прошлом для проекта, где мне нужно было скопировать файлы конфигурации, используется плагин Maven AntRun. То, что я сделал, это выполнить плагин на фазе ресурсов процесса и скопировать мои файлы конфигурации в указанный каталог с помощью задачи копирования Ant. Плагин Ассемблер выполняется на фазе пакета, поэтому он должен подбирать ваши файлы конфигурации, если вы положите его в нужное место. Надеюсь, это немного ответит на ваш вопрос.

Ответ 5

Я искал ответ на то, на что я думаю, ваш вопрос или, по крайней мере, очень похожий вопрос. Maven позволяет вам указывать каталоги ресурсов, используя maven-resources-plugin. У меня есть несколько файлов конфигурации в одном из моих каталогов ресурсов. Я заметил, что, поместив копии этих файлов в каталог etc/, который вы упоминаете (который находится в начале моего CLASSPATH), я могу изменить значения в тех файлах, которые будут использоваться во время выполнения. Затем мне захотелось, чтобы каталог etc/, созданный с копиями всего, из моего каталога ресурсов по умолчанию. Цель copy-resources от плагина maven-resources позволила мне это сделать. Эта строфа из "Примеры" > "Копировать ресурсы" на левой боковой панели (я ограничена двумя ссылками в этом сообщении) - это то, что я сделал для меня:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/target/extra-resources</outputDirectory>
              <resources>          
                <resource>
                  <directory>src/non-packaged-resources</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>            
          </execution>
        </executions>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>