Выбор определенных файлов ресурсов в WAR из местоположения src/main/resources по умолчанию с помощью Maven

Я пытаюсь контролировать, какие файлы входят в пакет WAR, созданный mvn package Цель. В частности, я хочу исключить некоторые файлы по умолчанию src/main/resources папка для каждого пакета (я пытаюсь сделать builds/package для разных сред).

Я пытался использовать Maven-War-плагин, но не удалось. Если я добавлю эту конфигурацию (для тестирования):

<webResources>
    <resource>
        <directory>src/main/resources</directory>
        <targetPath>WEB-INF/classes</targetPath>
        <excludes>
            <exclude>*.xml</exclude>
        </excludes>
    </resource>
</webResources>

... мой WEB-INF/classes будет по-прежнему содержать файлы XML. Это потому что webResources Параметр, кажется, дублирует процесс копирования (приведенная выше конфигурация фактически работает, файлы не копируются... но вместо этого они копируются в каком-то другом процессе).

Документация Maven-war-plugin гласит:

Каталог ресурсов по умолчанию для всех проектов Maven 2 - это src/main/resources, который в конечном итоге окажется в target/classes и в WEB-INF/classes в WAR. Структура каталога будет сохранена в процессе.

Плагин WAR также может включать ресурсы, не найденные в каталоге ресурсов по умолчанию, с помощью параметра webResources.

Это немного сбивает с толку. Означает ли это, что:

  • webResources Параметр - это функция в плагине maven-war, позволяющая включать файлы только извне src/main/resources папка? Если так, как мы можем изменить скопированные файлы изнутри src/main/resources?
  • webResources Параметр - это функция в maven-war-plugin, которая позволяет включать файлы и извне src/main/resources папка? Если так, как это может быть настроено для этого?
  • Какой-то другой вариант?

2 ответа

Решение

Я пытаюсь контролировать, какие файлы входят в пакет WAR, созданный целью пакета mvn. В частности, я хочу исключить некоторые файлы из папки src/main/resources по умолчанию для каждого пакета

Ресурсы из каталога ресурсов по умолчанию (src/main/resources) копируются в выходной каталог сборки (target/classes) в течение process-resourcesфаза. Затем во времяpackageфаза, содержаниеtarget/classes берется и упаковывается в распределенный архив, такой как WAR, и заканчивается WEB-INF/classes в таком случае.

Итак, если вы хотите контролировать, какие ресурсы в конечном итогеWEB-INF/classes, вам нужно контролировать, какие ресурсы будут в конечном итогеtarget/classesто есть как-то изменить поведение цели, связанной с process-resources фаза, в частности, resources:resources цель Maven Resources Plugin.

И для этого (это, вероятно, не интуитивно), вы можете объявить exclude или же include элементы внутри resources элемент pom, как показано в разделе Включение и исключение файлов и каталогов. Применяется к каталогу ресурсов по умолчанию:

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <excludes>
        <exclude>**/*.xml</exclude>
      </excludes>
    </resource>
  </resources>
</build>

И если вы хотите использовать собственные правила исключения для разных сред, объедините это с профилями. Например:

<project>
  ...
  <profiles>
    <profile>
      <id>env-uat</id>
      <activation>
        <property>
          <name>env</name>
          <value>uat</value>
        </property>
      </activation>
      <build>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <excludes>
              <exclude>**/*.xml</exclude>
            </excludes>
          </resource>
        </resources>
      </build>
    </profile>
  </profiles>
</project>

И при использовании этого профиля XML-файлы не будут в конечном итоге в target/classes и, следовательно, они не окажутся в WEB-INF/classes в финальной войне.

Я пытался использовать Maven-War-плагин, но не удалось. Если я добавлю эту конфигурацию (для тестирования) (...), мои WEB-INF/ классы все равно будут содержать файлы XML

Здесь вы добавляете каталог дополнительных ресурсов, который выглядит как уже включенный каталог ресурсов по умолчанию. Итак, что бы вы ни исключали, это не имеет никакого эффекта, так как файлы копируются в target/classes в течение process-resources в любом случае, и, таким образом, по-прежнему в конечном итоге в WEB-INF/classes,

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

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <webResources>
            <resource>
              <!-- this is relative to the pom.xml directory -->
              <directory>extra-resources</directory>
            </resource>
          </webResources>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

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

См . Ответ Паскаля для правильной конфигурации и хорошего объяснения процесса. Я просто даю прямой ответ на этот вопрос здесь:

  • Параметр webResources - это функция в maven-war-plugin, которая позволяет включать файлы только из папки src/main/resources? Если да, как мы можем изменить скопированные файлы из src/main/resources?
  • Параметр webResources - это функция в maven-war-plugin, которая позволяет включать файлы также из папки src/main/resources? Если так, как это может быть настроено для этого?

Это первое, webResources параметр в maven-war-plugin позволяет только включать дополнительные ресурсы извне src/main/resources, Это не позволяет настраивать включает / исключает для src/main/resources сам.

Другие вопросы по тегам