Где в пути проекта maven я должен помещать файлы конфигурации, которые не считаются ресурсами

У меня есть простой проект java maven. Один из моих классов при выполнении должен загрузить файл конфигурации xml из пути к классам. Я не хочу упаковывать такой файл xml при создании jar, но я хочу включить XML файл по умолчанию в zip-сборку под подпапкой conf, и я также хочу, чтобы этот xml-код по умолчанию был доступен в модульных тестах для проверки на него.

Как я вижу, это два возможных места по умолчанию xml:

  • src/main/resources/conf/default.xml
  • src/main/conf/default.xml

Оба решения требуют специальных действий pom:

  • В решении 1 я получаю автоматическую копию в целевой папке во время сборки, что означает, что она доступна при тестировании, но я также получаю ее в выпущенной банке, которую я не хочу.

  • В решении 2 я получаю банку, как я ее хочу (без xml), но мне нужно вручную скопировать xml в целевую папку, которая будет доступна для тестирования. (Я не хочу добавлять подпапки src в тестовый класс. Я думаю, что это плохая практика).

Вопрос: какое лучшее решение для этих двух?
- Если правильное значение равно 2, каков наилучший способ его скопировать в целевую папку?
- Есть ли другое решение лучше и чаще, чем эти два?

(Я также читаю Где я должен поместить файлы конфигурации приложения для проекта Maven?, но я хотел бы узнать самое "правильное решение" из "конвенции более конфигурация", и эта ссылка предоставляет некоторые варианты типа конфигурации, но не любые ориентированные на конвенцию. Возможно, в любом случае нет никого, кроме как я спрашиваю. Кроме того, предоставленные решения включают плагин AntRun и плагин appAssembler, и мне интересно, могу ли я это сделать без их).

Ответы

Ответ 1

Вопрос в том, что является лучшим решением этих двух? Если правильное значение равно 2, каков наилучший способ его скопировать в целевую папку? Есть ли другое решение лучше и чаще, чем эти два?

Так как вы хотите, чтобы этот файл был скопирован в папку target/classes, он как-то должен рассматриваться как ресурс (поэтому либо помещаться в src/main/resources, либо объявлять src/main/conf в качестве каталога ресурсов). И если вы не хотите этого в финальной банке, настройте Maven JAR Plugin, чтобы исключить его:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
          <excludes>
            <exclude>**/conf/*</exclude>
          </excludes>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

Для части сборки дескрипторы сборки довольно гибкие, поэтому можно добиться того, чего вы хотите, независимо от выбора. Однако я бы предложил использовать самую легкую настройку.

Ответ 2

Вы можете поместить его в файл src/test/conf/default.xml. Ваши тестовые классы могут найти его, но он не будет упакован с использованием стандартного метода.

С дополнительной сборкой вы можете упаковать ее оттуда. Этот шаг всегда необходим.

Другим решением может быть создание отдельного модуля maven и размещение его в /src/main/resources/conf/.... Затем сделайте эту банку тестовой зависимостью. Вам не нужно делать какую-либо специальную конфигурацию плагина, но я думаю, что это слишком много для одного файла.

Ответ 3

Мое решение состояло в том, чтобы использовать два профиля: Development (по умолчанию) и Packaging

Мой раздел по умолчанию/содержит как src/main/resources, так и src/main/conf. Я называю это своим профилем развития, который является неявным профилем.

Мой профиль упаковки - это явный профиль, который определен в разделе. Там под/я упоминал только src/main/resources. Когда я запускаю свою упаковку script (у нас в настоящее время это внешнее maven с момента создания RPM из нашей WAR), я запускаю 'mvn install -Drpm' для активации моего профиля упаковки (rpm - это идентификатор для профиль упаковки.

Если это было недостаточно ясно, не стесняйтесь задавать больше вопросов.

Ответ 4

Если ваша упаковка - война, вы можете использовать опцию конфигурации packagingExcudes в плагине maven-war:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <!-- Exclude abc.properties found in src/main/resources/ (ends up getting packaged in WEB-INF/classes/) -->
          <packagingExcludes>
            WEB-INF/classes/abc.properties
          </packagingExcludes>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

Используйте запятые для разделения между несколькими ресурсами, которые вы хотите исключить. Кроме того, вы можете использовать подстановочные знаки и регулярные выражения в ваших исключенных путях. Для регулярных выражений это в синтаксисе %regex[YOUR_REGEX_HERE]. Проверьте документацию для более подробной информации.