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

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

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

  1. src/main/resources/conf/default.xml
  2. src/main/conf/default.xml

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

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

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

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

(я также прочитал Где я должен поместить файлы конфигурации приложения для проекта Maven? , но я хотел бы знать наиболее «правильное решение» с точки зрения «соглашения поверх конфигурации», и эта ссылка предоставляет некоторые решения типа конфигурации, но неЛюбое соглашение ориентировано. Может быть, нет ни одного, но я все равно спрашиваю. Также предоставляются решения, включающие плагин AntRun и плагин appAssembler, и мне интересно, смогу ли я сделать это без них.)

Ответы [ 4 ]

46 голосов
/ 09 июня 2010

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

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

<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 голосов
/ 12 июня 2010

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

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

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

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

1 голос
/ 09 июня 2010

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

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

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

0 голосов
/ 17 апреля 2019

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

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

...