1. Плагін копіювання ресурсів maven-resources-plugin

Якщо ти складаєш (збираєш) вебзастосунок, у тебе буде просто купа різних ресурсів у ньому. Це 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. Фільтрування ресурсів за допомогою 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>
            </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.

3. Плагін внесення вихідних кодів maven-source-plugin

Ще один корисний плагін – maven-source-plugin дозволяє вносити до складання вихідний код ваших java-файлів. Навіщо?

Справа в тому, що окрім вебзастосунків за допомогою 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>

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.