[英]Collecting data across multiple executions of Mojo in custom 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进程中,但是某些模块使用了第二个classloader 。 我隐约知道为什么:受影响的模块(旧有的东西)使用一个外来的插件(NetBeans Maven插件),今天我发现我不得不将失望添加到它引起我们的大量问题中。
Anway, 问题:
1) 在单个多模块构建期间,是否有正确的方法可以在给定Mojo的所有执行中收集内存中的数据? (或者是否有办法确保所有执行都在同一JVM和同一类加载器中进行?)
2) 一旦访问了所有模块,如何检测构建结束? 我想我可以观察到构建中的某些内容...抱歉,我的理解还不完整...生命周期,反应堆...实现此目标我缺少什么概念?
我准备阅读有关这是一个坏主意的信息! 我现在只是在做实验:如果我被误导了,我确实需要“指导”。
我检查了该Q / A,但这是关于在单个模块中跨3种不同的Mojo共享。
(现在我可以每次转储结果,最后一个覆盖前一个结果,对于我的用例来说还可以,但是如果我可以改善它,那将是很好的)
SonarQube在sonar-scanner-maven中执行此操作,请参阅SonarQubeMojo 。
0)Mojo具有注释 aggregator = true
1)数据收集在mojo的静态变量中
2)他们通过对访问的模块进行计数并将其与预期的总数进行比较来确定“构建结束”。 如果这不是最后一个模块,则不执行任何操作(或收集需要收集的内容...),如果不运行该模块(合并结果)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.