如何在所有模块上运行Maven插件?

时间:2011-05-12 21:01:00

标签: maven maven-plugin maven-release-plugin mojo

我有一个自定义插件,我作为发布的一部分在我们的所有项目上运行:执行目标。

我们刚开始使用多模块构建,我注意到我的插件只在顶层模块上运行。我需要做什么才能让我的插件在发布结束时单独在所有模块上运行?我是否必须在插件代码中迭代它们?如果是这样,是否有这样做的例子,因为从我看到,MavenProject.getModules()只返回这些模块的String名称列表,我看不到如何获取这些模块的信息(我的插件需要groupId:artifactId:每个版本,在这种情况下,模块并不总是具有相同的版本。)

我尝试过使用和不使用@aggregator,但这并没有改变我的问题。

我假设这与从CLI直接运行插件(不依赖于某个阶段)的情况相同,CLI也只在项目的顶层运行,并为所有子模块报告SKIPPED。

我正在使用Maven 3.0.3。

2 个答案:

答案 0 :(得分:2)

我的Maven插件遇到了同样的问题。它只被调用一次(通常用于反应器中的第一个模块),我最终追溯到我的插件有Maven注释“@requiresProject false”的事实。似乎Maven Reactor只调用一次这样的插件。一旦我切换到“@requiresProject true”,我的mojo就会为每个模块调用一次。我没有挂钩释放:表演,所以YMMV。

至于访问所有模块,而不是使用提供其名称的MavenProject.getModules(),您可以像这样注入他们的MavenProject对象:

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

绑定到生命周期阶段时注意@aggregator。 “当绑定到生命周期时,聚合器mojo可能会产生一些令人讨厌的副作用。它可以强制执行...生命周期阶段提前执行,并且可能导致构建最终执行...阶段两次。” ref

How do you force a maven MOJO to be executed only once at the end of a build?有一些@aggregator的替代品。

答案 1 :(得分:1)

使用新的maven-plugin-annotations你也可以注入:

@Component
private MavenSession session;

并致电session.getProjects()(Maven 3)或session.getSortedProjects()(2)。