2.1 Плагин копирования ресурсов maven-resources-plugin

Если ты собираешь web-приложение, то у тебя будет просто куча различных ресурсов в нем. Это jar-библиотеки, jsp-сервлеты, файлы настроек. Ну и конечно же это куча статических файлов типа html, css, js, а также различных картинок.

По умолчанию Maven при сборке проекта просто скопирует все ваши файлы из папки src/main/resources в директорию target. Если же ты хочешь внести изменения в это поведение, то тебе поможет плагин maven-resources-plugin.

Пример кода такого плагина:

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>
                   ${basedir}/target/resources
                </outputDirectory>
                <resources>
                    <resource>  инструкции по копированию ресурса 1 </resource>
                    <resource>  инструкции по копированию ресурса 2 </resource>
                    <resource>  инструкции по копированию ресурса N </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

Данный плагин вызовется во время фазы validate. С помощью тега <outputDirectory> можно задать директорию, в которую плагин должен будет скопировать ресурсы, заданные в секции <resources>. И вот тут-то плагин может развернуться во всю свою мощь.

2.2 Фильтрация ресурсов с помощью maven-resources-plugin

Ресурсы плагина можно задавать не только в виде файлов, а сразу в виде директорий. Более того, к директории можно добавить маску, которая задает какие именно файлы из нее будет включены в данный ресурс.

Пример:


            <resource>
                <directory>src/main/resources/images</directory>
                <includes>
                     <include>**/*.png</include>
                </includes>
            </resource>

Две звездочки в качестве маски обозначают любое количество директорий. В примере выше в качестве данных ресурса будут взяты все png-файлы, которые содержаться в директории src/main/resources/images (и ее поддиректориях).

Если ты хочешь исключить какие-нибудь файлы, можешь воспользоваться тегом exclude. Пример:

<resource>
    <directory>src/main/resources/images</directory>
    <includes>
        <include>**/*.png</include>
    </includes>
    <excludes>
         <exclude>old/*.png</exclude>
    </excludes>
</resource>

Теги применяются последовательно: сначала к ресурсу будут добавлены указанные в include-файлы, а затем из этого списка исключат exclude-файлы.

Но и это еще не все. Плагин умеет заглядывать внутрь файлов (если они текстовые, конечно). И, например, добавить в файл application.properties нужную версию сборки. Чтобы плагин обрабатывал содержимое файла, нужно указать ему параметр <filtering>true</filtering>.

Пример:

<resource>
    <directory>src/main/resources/properties</directory>
    <filtering>true</filtering>
    <includes>
        <include>**/*. properties </include>
    </includes>
</resource>

Более подробно с данным плагином можно ознакомиться по ссылке: https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

2.3 Плагин включения исходных кодов maven-source-plugin

Еще один полезный плагин – maven-source-plugin позволяет включать в сборку исходный код ваших java-файлов. Зачем?

Все дело в том, что кроме web-приложений, с помощью Maven собирается очень большое количество библиотек. Очень много Java-проектов следуют концепции open-source и распространяются среди Java-сообщества со своими исходниками.

Зачем нужен отдельный плагин? Почему нельзя просто скопировать исходники и все?

Во-первых, в любом сложном проекте исходники могут храниться в нескольких местах.

Во-вторых, часто используется генерация исходников на основе xml-спецификаций, такие исходники тоже нужно включать в сборку.

Ну и в-третьих, ты можешь решить не включать какие-нибудь особо секретные файлы в вашу сборку.

Пример использования плагина maven-source-plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.2.1</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <phase>verify</phase>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

2.4 Плагин копирования зависимостей maven-dependency-plugin

Также тебе может понадобиться умное копирование зависимостей (библиотек) при сборке проекта. Для этого используется плагин maven-dependency-plugin.

Пример:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
        <outputDirectory>
            ${project.build.directory}/lib/
        </outputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

В этом примере прописано дефолтное поведение плагина – копирование библиотек в директорию ${project.build.directory}/lib.

В секции execution прописано, что плагин будет вызван во время фазы сборки – package, goal – copy-dependences.

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

1 dependency:analyze анализ зависимостей (используемые, неиспользуемые, указанные, неуказанные)
2 dependency:analyze-duplicate определение дублирующихся зависимостей
3 dependency:resolve разрешение (определение) всех зависимостей
4 dependency:resolve-plugin разрешение (определение) всех плагинов
5 dependency:tree вывод на экран дерева зависимостей

Также в разделе configuration можно задать дополнительные параметры:

1 outputDirectory Директория, в которую будут копироваться зависимости
2 overWriteReleases Флаг необходимости перезаписывания зависимостей при создании релиза
3 overWriteSnapshots Флаг необходимости перезаписывания неокончательных зависимостей, в которых присутствует SNAPSHOT
4 overWriteIfNewer Флаг необходимости перезаписывания библиотек с наличием более новых версий

Пример:


<configuration>
    <outputDirectory>
         ${project.build.directory}/lib/
    </outputDirectory>
    <overWriteReleases>false</overWriteReleases>
    <overWriteSnapshots>false</overWriteSnapshots>
    <overWriteIfNewer>true</overWriteIfNewer>
 </configuration>

По умолчанию <overWriteReleases> и <overWriteSnapshots> – false, для <overWriteIfNewer> – true.