【问题标题】: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 对象是否具有至少一个模块,如果有,则执行,否则跳过...虽然看起来不太好。
【问题讨论】:
标签:
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
}