Пишем собственный maven плагин

Как я писал раньше, всю настоящую работу в выполняют плагины. И эти плагины кем-то были разработаны, а следовательно, можно написать и свой собственный плагин.

Подготовка

Лучше всего начинать писать собственный плагин с создания проекта с помощью спецального архетипа:

Обратите внимание на имя, name-maven-plugin. По соглашению все плагины должны иметь имя артефакта, оканчивающееся на -maven-plugin.

В созданный пустой архетип полезно будет добавить пару зависимостей:

maven-plugin-api добавляет архетип, а вот остальные необходимо добавить вручную. maven-core используется для доступа к внутренним структурам maven во время выполнения, maven-plugin-annotations позволяет конфигурировать плагин аннотациями в коде. javassist для разработки плагинов не нужен и используется мной только в коде.

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

Ну и уровень языка поднять не забываем.

Код плагина

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

В первую очередь рассмотрим аннотацию @Mojo, которой аннотирован класс плагина:

Эта аннотация говорит maven, какой это плагин и как его использовать. name = "setname" создаёт goal и присваивает ей имя setname. defaultPhase = LifecyclePhase.PROCESS_CLASSES указывает, в какую фазу по умолчанию вызывать goal. А  threadSafe = true говорит maven, что плагин можно выполнять параллельно с другими плагинами фазы.

Следующий участок кода отвечает за получение параметров из файла pom. Как можно догадаться, значение параметра name будет помещено в переменную name.

Последняя переменная используется для доступа к параметрам проекта во время сборки:

Что же делает сам плагин? В принципе всё что угодно 🙂 Всё, что будет написано в методе execute, будет исполнено и maven не делает никаких предположений о этом коде. В моём случае, поскольку это демонстрационный плагин, я ищу определённый класс в classpath проекта, ищу в нём определённое поле и вывожу его:

Обратите внимание, как используется инфраструктура maven в коде плагина.

Использование

Чтобы использовать плагин, нам потребуется ещё один проект maven. Я создал его используя стандартный архетип maven-archetype-quickstart и разместил в нём два файла с кодом:

Именно строку NAME из класса Target ищет и выводит мой плагин! Давайте добавим его к сборке:

Я связываю goal setname своего плагина с фазой process-classes и задаю параметру name значение «Will greet:» Теперь достаточно установить плагин командой mvn install и выполнить сборку второго проекта:

Код примера доступен на github.