5

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

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

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

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

我正在使用 Maven 3.0.3。

4

3 回答 3

3

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

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

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

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

你如何强制一个 maven MOJO 在构建结束时只执行一次?有一些@aggregator 的替代品。

于 2011-12-13T06:50:39.523 回答
2

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

@Component
private MavenSession session;

并调用session.getProjects()(Maven 3) 或session.getSortedProjects()(2)。

于 2014-03-11T21:12:46.580 回答
0

出于某种原因@seanf,我的答案对我不起作用(可能是因为我使用了更新版本的 Maven?!)所以我修改了代码以接受@Parameter注释并且它起作用了!

@Parameter(defaultValue = "${reactorProjects}", required = true, readonly = true)
private List<MavenProject> reactorProjects;
于 2021-09-29T12:26:38.230 回答