在自定义Maven插件中跨Mojo的多个执行收集数据

时间:2017-05-23 15:51:01

标签: java maven maven-plugin

我有一个多模块maven项目,我想使用自定义插件收集有关所有模块的一些信息。

我设法得到了我想要的每个模块。由于我收集的信息的性质,在内存中收集在最后转储合并结果会更有效。

自定义Mojo说明了这个想法(我知道这不起作用,见下文):

@Mojo(name = "dummy")
public class DummyMojo extends AbstractMojo {

    private static Set<String> data = Collections.synchronizedSet(new HashSet<String>());

    @Parameter(defaultValue = "${project}", readonly = true)
    private MavenProject mavenProject;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        data.add(mavenProject.getArtifactId());
        getLog().info("Execution #" + data.size());
    }

}

这会收集我所有模块的工件ID(这只是一个简化的例子,实际上我收集了其他一些不相关的东西)。

我想在构建的最后转储结果。

如果我运行此操作,我会发现创建了2个实例(我有> 100个模块):

% mvn com.company:foo:1.0-SNAPSHOT:dummy | grep 'Execution #'
[INFO] Execution #1
...
[INFO] Execution #6
[INFO] Execution #13
[INFO] Execution #14
[INFO] Execution #15
[INFO] Execution #7
[INFO] Execution #8
[INFO] Execution #9
....
[INFO] Execution #90
[INFO] Execution #91
[INFO] Execution #13
[INFO] Execution #92
[INFO] Execution #14
[INFO] Execution #15
[INFO] Execution #39
[INFO] Execution #40
[INFO] Execution #41

所以我观察到我无法收集每个模块的数据,并使用静态变量在每个Mojo执行中共享它。

如果我还打印PID和ClassLoader,我发现它们都发生在同一个JVM进程中,但第二个类加载器用于某些模块。我隐约知道原因:受影响的模块(遗留的东西)使用了一个异国情调的插件(NetBeans Maven插件),今天我发现我必须对它给我们造成的问题堆添加失望。

Anway,问题:

1)在单个多模块构建期间,是否有正确的方法在给定Mojo的所有执行中收集内存中的数据?(或者有没有办法确保所有执行都发生在同一个JVM&amp; ;相同的类加载器?)

2)一旦访问过所有模块,我怎样才能检测到构建结束?我想我可以观察到构建中有什么东西......对不起,我的理解是不完整的......生命周期,反应堆......我想要实现这个概念是什么概念?

我准备好了解这是一个坏主意!我只是在这一点上进行实验:如果我误入歧途,我确实需要&#34;指导&#34;。

我检查了that Q/A,但它是关于为单个模块共享3个不同的Mojos。

(现在我可以每次都转储结果,最后一个会覆盖以前的结果,对我的用例来说还可以,但如果我可以改进,那就太好了)

1 个答案:

答案 0 :(得分:0)

SonarQube在sonar-scanner-maven中执行此操作,请参阅SonarQubeMojo

0)Mojo有annotation aggregator = true

1)数据收集在mojo

中的静态变量中

2)他们确定&#34;构建结束&#34;通过计算访问模块并将其与预期总数进行比较。如果这不是最后一个模块,那么什么都不做(或者收集什么需要收集...),如果是,则运行该事物(合并结果)。