【问题标题】:How do I run a Maven Plugin on all modules?如何在所有模块上运行 Maven 插件?
【发布时间】:2024-05-03 11:40:03
【问题描述】:

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

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

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

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

我正在使用 Maven 3.0.3。

【问题讨论】:

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


    【解决方案1】:

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

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

       /**
        * 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 的替代品。

    【讨论】:

    • 以上所有方法都对我有用: - @requiresProject true 使插件在所有模块上运行(没有@aggregator) - 传入 reactorProjects 也很有效,让我运行整个反应堆的插件一次,这对我来说效率更高
    【解决方案2】:

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

    @Component
    private MavenSession session;
    

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

    【讨论】:

      【解决方案3】:

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

      @Parameter(defaultValue = "${reactorProjects}", required = true, readonly = true)
      private List<MavenProject> reactorProjects;
      

      【讨论】:

        最近更新 更多