我有一个多模块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。
(现在我可以每次都转储结果,最后一个会覆盖以前的结果,对我的用例来说还可以,但如果我可以改进,那就太好了)
答案 0 :(得分:0)
SonarQube在sonar-scanner-maven中执行此操作,请参阅SonarQubeMojo。
0)Mojo有annotation aggregator = true
1)数据收集在mojo
中的静态变量中2)他们确定&#34;构建结束&#34;通过计算访问模块并将其与预期总数进行比较。如果这不是最后一个模块,那么什么都不做(或者收集什么需要收集...),如果是,则运行该事物(合并结果)。