1. Знайомство з плагінами

Стандартні життєві цикли можна доповнити функціоналом за допомогою Maven-плагінів. Плагіни дозволяють вставляти до стандартного циклу нові кроки (наприклад, розподіл на сервер додатків) або розширювати існуючі кроки.

Плагіни в Maven не є чимось екстраординарним. Навпаки: це звичайнісінька річ, що часто зустрічається. Адже якщо ви хочете зазначити якісь нюанси складання вашого проєкту, вам потрібно вказати потрібну інформацію у pom.xml. І єдиний спосіб це зробити – написати “плагін”.

Оскільки плагіни є такими ж артефактами, як і залежність, вони описуються практично так само. Замість розділу dependencies – plugins, замість dependency – plugin, замість repositories – pluginRepositories, repository – pluginRepository.

Приклад:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>2.6</version>
    </plugin>
</plugins>

Оголошення плагіна в pom.xml дозволяє зафіксувати версію плагіна, а також встановити для нього необхідні параметри, визначити різні параметри конфігурації та прив'язати до фаз.

Інакше кажучи, Maven запускає певні плагіни, які виконують всю роботу. Тобто, якщо ми хочемо навчити Maven особливим складанням проєктів, необхідно додати до pom.xml вказівку на запуск потрібного плагіна в потрібну фазу і з потрібними параметрами.

Кількість доступних плагінів дуже велика. Є різноманітні плагіни, що дозволяють безпосередньо з maven запускати вебзастосунок для тестування його у браузері, генерувати ресурси тощо. Головним завданням розробника в цій ситуації є знайти та застосувати найбільш відповідний набір плагінів.

2. Життєвий цикл та плагіни

Дуже часто плагін використовується для того, щоб під час виконання певної фази запустити якусь консольну утиліту. Більш того, ми можемо запустити навіть звичайний Java-клас (який має метод main, звісно).

Приклад:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.2.1</version>
  <executions>
    <execution>
      <goals>
        <goal>java</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <mainClass>com.example.Main</mainClass>
    <arguments>
      <argument>first-argument</argument>
      <argument>second-argument</argument>
    </arguments>
  </configuration>
</plugin>

Зазвичай плагіни можна гнучко налаштовувати. Усі офіційні плагіни від розробників Maven дуже добре документовані на офіційному сайті Maven. Наприклад, для maven-compiler-plugin на сторінці Apache Maven Project можна побачити список усіх змінних, що керують плагіном. Інформація про плагін доступна за цим посиланням.

А ось іще важлива інформація. Різні плагіни викликаються Maven'ом на різних стадіях життєвого циклу. Так проєкт, що описує десктопний Java-застосунок на swing, має стадії життєвого циклу, відмінні від тих, що характерні для розробки вебзастосунку (war).

Або, наприклад, коли виконується команда “mvn test”, ініціюється цілий набір кроків у життєвому циклі проєкту: “process-resources”, “compile”, “process-classes”, “process-test-resources”, “test-compile”, "Test". Згадки про ці фази ви можете бачити у виведених Maven-ом повідомленнях:

[INFO] Scanning for projects...
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources)     @ javarush ---
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile)      @ javarush
[INFO] --- maven-resources-plugin:2.6:testResources         (default-testResources) @ javarush ---
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile)          @ javarush ---
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test)         @ javarush ---
[INFO] Surefire report directory:           t:\ projects\javarush\target\surefire-reports

3. Цілі в Maven – goals

У Maven є ще таке поняття як ціль (goal). goal - це мета запуску Maven'а. Основні цілі збігаються з основними фазами:

  • validate;
  • compile;
  • test;
  • package;
  • verify;
  • install;
  • deploy.

У кожній фазі життєвого циклу проєкту викликається певний плагін (jar-бібліотека), який містить певну кількість цілей (goal)

Наприклад, плагін "maven-compiler-plugin" містить дві цілі: compiler:compile для компіляції основного вихідного коду проєкту та compiler:testCompile для компіляції тестів. Формально список фаз можна змінювати, хоча це рідко коли потрібно.

Якщо тобі необхідно виконати якісь нестандартні дії у певній фазі, потрібно лише додати відповідний плагін до pom.xml

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>имя-плагина</artifactId>
  <executions>
    <execution>
      <id>customTask</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>pluginGoal</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Найважливіше в цьому випадку – визначити для плагіна найменування фази “execution/phase”, в яку потрібно вбудувати виклик цілі плагіна “goal”. Наприклад, тобі потрібно створити Java-код на основі xml. Тоді тобі знадобиться фаза “generate-sources”: вона розташовується перед викликом фази compile та ідеально підходить для генерування частини вихідних кодів проєкту.