【问题标题】:How do I create a Mojo that by default doesn't run on child modules (like the -N flag)如何创建默认情况下不在子模块上运行的 Mojo(如 -N 标志)
【发布时间】:2012-08-30 15:55:12
【问题描述】:

我编写了一个仅设计为在父模块上运行的 Maven 插件。它基本上是一个定制的原型插件,有一些附加步骤,因此它是从命令行运行的,而不是生命周期的一部分。

目前在子模块上运行时会失败;它在执行命令的父模块上成功(我关心的位),但是当它然后迭代子模块时失败。现在我能想到的一种解决方法是-N 标志 - 这解决了问题。问题是这个插件将由许多不同的人从命令行运行,我希望它尽可能简单。

我查看了this 页面并尝试了可能的嫌疑人; @inheritByDefault=false 但这没什么区别。

有什么建议吗?

我想我可以在插件代码中检查 project 对象是否具有至少一个模块,如果有,则执行,否则跳过...虽然看起来不太好。

【问题讨论】:

  • 看来@inheritByDefault=false 确实不适用于maven3,见MPLUGIN-375

标签: maven maven-3 maven-plugin archetypes


【解决方案1】:

我通常通过比较 maven 会话的执行根目录和模块的基目录来解决这个问题:

public class ReactorRootRunnerMojo extends AbstractMojo {

  /**
   * @parameter expression="${session}"
   */
  private MavenSession session; 

  public void execute() throws MojoExecutionException, MojoFailureException {
    if (!isReactorRootProject()) {
        return;
    }
    // your code
  }

  private boolean isReactorRootProject() throws MojoExecutionException {
    try {
      String executionRootPath = new File(session.getExecutionRootDirectory()).getCanonicalFile().getAbsolutePath();
      String basedirPath = basedir.getCanonicalFile().getAbsolutePath();
      return executionRootPath.equals(basedirPath);
    } catch (IOException e) {
      throw new MojoExecutionException(e);
    }
  }
}

【讨论】:

    【解决方案2】:

    您可以简单地检查reactor的当前项目是否与顶级项目相同并继续:

      /**
       * @parameter expression="${session}"
       */
      private MavenSession session; 
    
        @Override
        public void execute() throws MojoExecutionException, MojoFailureException {
            if (!session.getCurrentProject().equals(session.getTopLevelProject())) {
                return;
            }
            // Now do stuff on the top-level project only
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多