Как запустить плагин Maven на всех модулях?

У меня есть собственный плагин, который я запускаю во всех наших проектах как часть цели Release:perform.

Мы только начинаем использовать многомодульные сборки, и я заметил, что мой плагин работает только на верхнем модуле. Что мне нужно сделать с моим плагином, чтобы он работал на всех модулях по отдельности в конце выпуска? Должен ли я перебирать их в самом коде плагина? Если да, то есть ли пример этого, потому что из того, что я вижу, MavenProject.getModules() просто возвращает список строковых имен этих модулей, и я не вижу, как получить информацию об этих модулях (мой плагин нуждается groupId:artifactId:version каждого, и в этом случае модули не всегда имеют одну и ту же версию).

Я пробовал с @aggregator и без него, но это ничего не меняет в отношении моей проблемы.

Я предполагаю, что это тот же случай, что и запуск плагина напрямую (без привязки к фазе) из CLI, который также работает только на верхнем уровне проекта и сообщает SKIPPED для всех подмодулей.

Я использую Maven 3.0.3.


person Ben    schedule 12.05.2011    source источник


Ответы (2)


У меня была такая же проблема с моим плагином Maven. Он вызывался только один раз (обычно для первого модуля в реакторе), и в конце концов я проследил это до того, что мой плагин имел аннотацию Maven «@requiresProject false». Кажется, что Maven Reactor вызывает такие плагины только один раз. Как только я переключился на «@requiresProject true», мое моджо вызывалось один раз для каждого модуля. Я не подключался к выпуску: исполнение, так что YMMV.

Что касается доступа ко всем модулям, вместо использования MavenProject.getModules(), который дает их имена, вы можете внедрить их объекты MavenProject следующим образом:

   /**
    * The projects in the reactor.
    *
    * @parameter expression="${reactorProjects}"
    * @readonly
    */
   private List<MavenProject> reactorProjects;

Следите за @aggregator при привязке к фазам жизненного цикла. «При привязке к жизненному циклу моджо-агрегатор может иметь некоторые неприятные побочные эффекты. Он может заставить выполнение фазы ... жизненного цикла выполняться раньше времени и может привести к сборкам, которые заканчиваются выполнением фазы ... дважды." ref

Как заставить maven MOJO выполняться только один раз в конце сборки? имеет несколько альтернатив @aggregator.

person seanf    schedule 13.12.2011
comment
Все вышеперечисленные способы сделать это работают для меня: - @requiresProject true заставляет плагин работать на всех модулях (без @aggregator) - передача реакторных проектов также отлично сработала и позволяет мне запустить плагин один раз для всего реактора, который для меня намного эффективнее - person Ben; 27.01.2012

Используя новый maven-plugin-annotations, вы также можете ввести:

@Component
private MavenSession session;

и вызовите session.getProjects() (Maven 3) или session.getSortedProjects() (2).

person Jesse Glick    schedule 11.03.2014