如何创建默认情况下不在子模块上运行的Mojo(如-N标志)

时间:2012-08-30 15:55:12

标签: maven maven-3 maven-plugin archetypes

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

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

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

有什么建议吗?

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

1 个答案:

答案 0 :(得分:2)

我通常通过将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);
    }
  }
}