JavaRush /Курсы /JSP & Servlets /Maven-плагины

Maven-плагины

JSP & Servlets
1 уровень , 5 лекция
Открыта

6.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 запускать web-приложение для тестирования его в браузере, генерировать ресурсы и тому подобное. Главной задачей разработчика в этой ситуации является найти и применить наиболее подходящий набор плагинов.

6.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, имеет стадии жизненного цикла отличные от тех, что характерны для разработки web-приложения (war).

Или, например, когда выполняется команда “mvn test”, инициируeтся целый набор шагов в жизненном цикле проекта: “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

6.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 и идеально подходит для генерирования части исходных кодов проекта.

Комментарии (19)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ardan Уровень 57
19 августа 2025
Мало информации что бы ее дополнить пришлось не мало покопаться в интернете но в целом теперь понятно зачем почему они нужны
dmirty Уровень 23
30 апреля 2025
Ничего не понятно, но очень интересно. Суть плагинов не раскрыта. В статье написаны только общие термины и слова: "где-то пригодится, как-то настраивается, что-то делает".
Ахиллес Юмошин Уровень 6
23 декабря 2024
Я так понимаю плагин в мейвене - это артефакт, встраиваемый в какую либо из фаз жизненного цикла мейвена, и направленный на выполнение специфических задач, связанных с ней? Не понимаю так ли это, прошу поправить меня старших. Не пойму что такое goals. Это просто указатель целевой фазы для плагина, или это непосредственная задача которую должен выполнять плагин?
26 февраля 2023
Я так и не понял зачем все это? Откуда такие сложности со сборкой?))) Раньше нажимали кнопку пуск и все, а сейчас столько фаз и плагинов. Сложно разбираться не представляя зачем это
Redya Daniel Уровень 16
27 февраля 2023
Да, сам долго не понимал и разбирался зачем оно нужно. По факту простые действия можно делать посредством идеи. Но более специфические действия, особенно на больших проектах, требуют дополнительной настройки. Я, на самом деле, полагаю, что с мавеном нужно сначала просто ознакомиться, понять, что он умеет и потренероваться запускать, собирать проект, запускать тесты, добавлять зависимости в POM. Почитать следующий уровень и подобавлять несколько плагинов, а остальное знать просто в теории. Более глубокого знания, я думаю, до первого трудоустройства не понадобится. Если я не прав в чём то, то пусть "старшие" меня исправят, потому что мавеном я сам недели 1.5 назад только начал знакомиться
Айрат М Уровень 26
12 июня 2023
Сейчас, что бы собрать большой проект, нужно много телодвижений. Почистить директорию, от старых файлов, скачать опен-сорс библиатеки (нужные для проекта), скомпилировать, протестировать, задеплоить - с этим всем справляются дефолтные плагины лайфцикла. Для специфических задач можно подключать плагины, и указать на какой фазе их запускать ( например, генерация отчета ). И вероятно что все эти телодвижения нужно повторять каждый день, что поддвержено человеческому фактору. Решение, описываешь эти все шаги в pom файле, и мавен будет делать это все за тебя.
Jamilya Уровень 10
17 октября 2023
В предыдущей лекции была ссылка: https://www.youtube.com/watch?v=IAbZVA4tK6M Можно посмотреть до половины и станет более понятен процесс сборки и облегчение его мэйвеном
Павел Уровень 61 Expert
27 января 2024
Спасибо дружище!
Ромушка Роман Уровень 32
15 декабря 2024
но почему в Python для добавления зависимостей достаточно виртуального окружения, файлика с названием библиотек и командой pip install в терминале, а здесь требуется Maven?
Denis Odesskiy Уровень 47
8 августа 2025
Потому что возможности pip и Maven, это как небо и земля. Maven намного гибче и у него значительно больше возможностей по сборке проекта. Pip же это просто установщик библиотек, довольно примитивная утилита, она не занимается сборкой и конфигурацией проектов.
Svetlana Kuzina Уровень 30
21 января 2023
Зависимости (dependency) — это те библиотеки, которые непосредственно используются в вашем проекте для компиляции кода или его тестирования. Плагины (plugin) же используются самим мавеном при сборке проекта или для каких-то других целей (например деплоймент)
15 декабря 2022
млин... норм вроде пытаюсь повторить что то но плагины не добавляются. Хорошо бы практических задач накидать как в предыдущих квестах
MineJavaAcc Уровень 42
26 сентября 2022
У меня дежавю с run level в Linux-подобных системах )
OB11TO Уровень 14
16 июня 2022
Чтобы легче было понять, что такое gloal (цели), просто представляйте обычный java class (Потому-что это так и есть)
LuneFox Уровень 41 Expert
10 июня 2022
Понятия не имею, зачем и каким образом может понадобиться генерировать Java-код из XML, для чего это нужно и почему бы не написать нужный код сразу. И где без этого не обойтись. Надеюсь, когда-нибудь просветление придёт...
Dmitry Vezhnin Уровень 3
13 июня 2022
Обычно это связано с API в корпоративных системах. Пересылаемые объекты описываются с помощью xsd-схемы, и по этой схеме можно сгенерировать Java-классы. Даже IDEA умеет генерировать Java классы на основе xsd из коробки.
Jh-007 Уровень 43
21 июня 2022
Есть такой язык - UML для визуального моделирования, он основан на xml. Можно нарисовать диаграмму классов и перегнать её в код. Была программа - Rational Rose. Я когда учился нам рассказывали. Видимо сейчас это заглохло.
Степан Мейн Уровень 24
9 июля 2022
Интересно, почитаю. Спасибо.
DEVX Уровень 20
4 февраля 2024
Мне это понадобилось при работе с SOAP протоколом. WSDL -> POJO