Где в пути проекта 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]
. Проверьте документацию для более подробной информации.