你怎么强迫maven MOJO在构建结束时只执行一次?

npe*_*low 10 java maven-2 mojo maven-plugin

我有一个MOJO我想执行一次,并且只有在反应堆的最后一个项目的测试阶段之后运行.

使用:

if (!getProject().isExecutionRoot()) {
        return ;
}
Run Code Online (Sandbox Code Playgroud)

在execute()方法的开头,意味着我的mojo被执行一次,但是在构建的最开始 - 在所有其他子模块之前.

npe*_*low 9

我发现的最佳解决方案是:

/**
 * The projects in the reactor.
 *
 * @parameter expression="${reactorProjects}"
 * @readonly
 */
private List reactorProjects;

public void execute() throws MojoExecutionException {

    // only execute this mojo once, on the very last project in the reactor
    final int size = reactorProjects.size();
    MavenProject lastProject = (MavenProject) reactorProjects.get(size - 1);
    if (lastProject != getProject()) {
        return;
    }
   // do work
   ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎适用于我测试过的小型构建层次结构.


sbl*_*ndy -1

通常,这是配置问题。您可能必须只为 mojo 设置一个项目,并使其依赖于所有其他项目。或者,您可以通过使其依赖于所有其他子项目来强制其中一个子项目成为最后一个。