2

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

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

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

有什么建议么?

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

4

2 回答 2

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);
    }
  }
}
于 2012-09-21T22:43:22.443 回答
0

您可以简单地检查 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
    }
于 2022-01-26T14:47:51.773 回答