如何在所有模块上运行 Maven 插件?
-
12-11-2019 - |
题
我有一个自定义插件,作为发布:执行目标的一部分在我们所有的项目上运行。
我们刚刚开始使用多模块构建,我注意到我的插件仅在顶部模块运行。我必须对我的插件做什么才能使其在版本结束时单独在所有模块上运行?我是否必须在插件代码本身中迭代它们?如果是这样,是否有这样做的示例,因为从我看来,MavenProject.getModules() 仅返回这些模块的字符串名称列表,并且我看不到如何获取这些模块的信息(我的插件需要每个模块的 groupId:artifactId:version,在这种情况下,模块并不总是具有相同的版本)。
我尝试过使用和不使用@aggregator,但这并没有改变我的问题。
我假设这与直接从 CLI 运行插件(不绑定到某个阶段)的情况相同,它也只在项目的顶层运行,并报告所有子模块的“SKIPPED”。
我正在使用 Maven 3.0.3。
解决方案
我对maven插件有同样的问题。它只是被调用一次(一般用于反应堆中的第一个模块),并且我最终将其追溯到我的插件让Maven注释“@RequiresProject false”。似乎Maven反应堆只调用一次此类插件。一旦我切换到“@requiresproject true”,我的mojo被调用一次,为每个模块调用一次。我没有挂钩发布:表演,所以ymmv。
要访问所有模块,而不是使用mavenproject.getmodules(),它可以将其MavenProject对象(如此:)注入其中:
/**
* The projects in the reactor.
*
* @parameter expression="${reactorProjects}"
* @readonly
*/
private List<MavenProject> reactorProjects;
.
在绑定到生命周期阶段时注意@aggregator。 “当绑定到生命周期时,聚合器Mojo可以具有一些令人讨厌的副作用。它可以强制执行......生命周期阶段以提前执行,并且可能导致构建最终执行...阶段两次。” ref
如何在构建末尾仅迫使maven mojo执行一次?有一些替代@aggregator。
其他提示
使用新的 maven-plugin-annotations
你还可以注入:
@Component
private MavenSession session;
并打电话 session.getProjects()
(Maven 3) 或 session.getSortedProjects()
(2).