Как включить отфильтрованные ресурсы в WEB-INF/классы с помощью плагина maven-resources?

Я использую плагин maven-resources-plugin, потому что мне нужно использовать собственный разделитель при фильтрации. Мой артефакт - ВОЙНА.

У меня есть некоторые ресурсы в моем каталоге src/main/resources. Обычно при упаковке WAR все, что находится в этом каталоге, заканчивается WEB-INF/classes. Но мне нужно, чтобы эти ресурсы сначала были отфильтрованы, а затем затем помещены в каталог WEB-INF/classes. Мне трудно настроить плагин maven-resources-plugin для этого. Есть ли способ?

Мой ПОМ выглядит так:

<build>
    <finalName>my-app</finalName>
    <filters>
        <filter>${basedir}/src/main/properties/base.properties</filter>
    </filters>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <overwrite>true</overwrite>
                        <useDefaultDelimiter>false</useDefaultDelimiter>
                        <delimiters>
                            <delimiter>@</delimiter>
                        </delimiters>
                        <outputDirectory>${project.build.directory}</outputDirectory>
                        <resources>
                            <resource>
                                <directory>
                                    ${basedir}/src/main/resources
                                </directory>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

person MegaMatt    schedule 07.01.2018    source источник


Ответы (2)


Короткий ответ:

Фаза неверна, validate — это вторая фаза, которую следует использовать только для проверки среды сборки и предшествует фазе process-resources по умолчанию, поэтому ваши правильные файлы переопределяются.

Длинный ответ:

По сути, у вас есть два варианта решения вашей проблемы:

Использовать другое/новое исполнение для копирования

Если вам действительно нужно другое поведение.

В этом случае ваша фаза неверна. Что происходит:

  • на этапе валидации (почему там?) ресурсы корректно фильтруются и копируются
  • на этапе process-resources default-resources выполнение плагина ресурсов запускает цель copy-resources, которая снова переопределяет отфильтрованные ресурсы в нефильтрованном состоянии.

Если вы действительно хотите сделать это таким образом, поместите ресурсы в каталог, отличный от src/main/resources, измените фазу выполнения на более подходящую (чтобы не путать) и, пожалуйста, также измените идентификатор выполнения (на что-то вроде copy-specially-filtered-resource - идентификатор можно использовать, чтобы объяснить, почему есть необходимость во втором исполнении)

Кроме того, выходной каталог неверен (должен быть: ${project.build.outputDirectory}, directory указывает только на целевую папку.

 <build>
    <finalName>my-app</finalName>
    <filters>
        <filter>${basedir}/src/main/properties/base.properties</filter>
    </filters>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
            <executions>
                <execution>
                    <id>copy-special-resources</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <overwrite>true</overwrite>
                        <useDefaultDelimiter>false</useDefaultDelimiter>
                        <delimiters>
                            <delimiter>@</delimiter>
                        </delimiters>
                        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
                        <resources>
                            <resource>
                                <directory>
                                    ${basedir}/src/main/filtered
                                </directory>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Кроме того, в этом случае я бы поместил фильтры и в конфигурацию выполнения (все остальное вводит в заблуждение).

Предпочтительно: просто перенастройте плагин ресурсов.

Короче и проще было бы просто перенастроить плагин ресурсов, активировать глобальную фильтрацию ресурсов и использовать выполнение по умолчанию (однако это также будет активно для тестовых ресурсов):

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <finalName>my-app</finalName>
    <filters>
        <filter>${basedir}/src/main/properties/base.properties</filter>
    </filters>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <useDefaultDelimiter>false</useDefaultDelimiter>
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

Подсказка: Использование конфига override обычно пахнет...

person blackbuild    schedule 07.01.2018
comment
Вы написали о default-resources цели, которой не существует. Это идентификатор выполнения плагина maven-resources-plugin, привязанного к жизненному циклу по умолчанию. И я не могу рекомендовать использовать maven-resources-plugin, потому что maven-war-plugin можно настроить для обработки этого... - person khmarbaise; 08.01.2018
comment
@khmarbaise Вы правы, я опечатался. Я имел в виду конечно исполнение default-resources цели copy-resources (сам код был правильный) - поправил. - person blackbuild; 08.01.2018
comment
@khmarbaise Что касается плагина resources и war, то следует различать. Если мы используем ресурс пути к классам, я бы действительно использовал плагин ресурсов, который обычно используется для ресурсов пути к классам (поскольку плагин войны также использует его). Однако для ресурса Non-Classpath я бы, конечно, использовал военный плагин. Однако в вопросе четко говорилось о ресурсах пути к классам (WEB-INF/классы) - person blackbuild; 08.01.2018

Во-первых, почему бы не прочитать документацию maven-war-plugin.

На основе документации вы можете определить конфигурацию для используйте дополнительный каталог и активируйте фильтрацию для этого каталога следующим образом:

 <configuration>
          <filters>
            <filter>properties/config.prop</filter>
          </filters>
          <nonFilteredFileExtensions>
            <!-- default value contains jpg,jpeg,gif,bmp,png -->
            <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
          </nonFilteredFileExtensions>
          <webResources>
            <resource>
              <directory>resource2</directory>
              <!-- it's not a good idea to filter binary files -->
              <filtering>false</filtering>
            </resource>
            <resource>
              <directory>configurations</directory>
              <!-- enable filtering -->
              <filtering>true</filtering>
              <excludes>
                <exclude>**/properties</exclude>
              </excludes>
            </resource>
          </webResources>
        </configuration>

Я бы порекомендовал создать дополнительный каталог, например src/main/filtered-resources, который вы настраиваете для фильтрации, и каталог ресурсов по умолчанию, который я бы не изменил (по умолчанию фильтрация отсутствует). Это облегчает понимание.

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

<delimiters>
  <delimiter>@</delimiter>
</delimiters>

Таким образом, в конце концов, нет необходимости делать дополнительную настройку для maven-resources-plugin и т. д.

person khmarbaise    schedule 07.01.2018
comment
Поскольку ОП спросил о ресурсе пути к классам, ИМХО следует использовать механизмы фильтрации ресурсов пути к классам, которые будут плагином resources. В вашем примере отфильтрованные файлы окажутся в корне файла War, в то время как OP хотел, чтобы они были в классах WEB-INF. - person blackbuild; 08.01.2018