运行 所有模块上的 maven 插件并行无依赖顺序

Run maven plugin on all modules in parallel without dependency order

我正在寻找一种在所有子模块上并行 运行 Maven 插件的方法,例如 the formatter plugin or checkstyle。它看起来像 mvn -T 1C formatter:format 有一个额外的魔法选项。
这与 运行ning 标准 maven 操作有点不同,因为无论格式如何,每个模块都相互独立。

例如,让我们考虑一个包含两个子模块 libapp 的项目。 app 依赖于 lib,实现其底层逻辑。
编译代码时,如果不先编译lib,就无法编译app。但是,在格式化代码时,我们可以安全地并行执行这两项操作。

我怀疑这是不可能的,因为它不遵循 Maven 体系结构,面向我们挂钩一些插件的预定义生命周期。但我可能漏掉了什么

是的,如果插件正确执行,您关于通过 -T1C 加速的假设是正确的。如您所见,formatter-maven-plugin 正确执行。如您所见,结果表明它提高了速度。

$ hyperfine -L threads 2,4,6,8,1C -p 'git co -- .' 'mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T {threads}'
Benchmark 1: mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 2
  Time (mean ± σ):     10.111 s ±  0.623 s    [User: 17.796 s, System: 0.918 s]
  Range (min … max):    9.349 s … 11.446 s    10 runs
 
Benchmark 2: mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 4
  Time (mean ± σ):      8.693 s ±  0.629 s    [User: 17.247 s, System: 0.862 s]
  Range (min … max):    7.827 s …  9.628 s    10 runs
 
Benchmark 3: mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 6
  Time (mean ± σ):      8.829 s ±  0.567 s    [User: 18.438 s, System: 0.965 s]
  Range (min … max):    8.098 s …  9.803 s    10 runs
 
Benchmark 4: mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 8
  Time (mean ± σ):      9.257 s ±  0.956 s    [User: 18.195 s, System: 0.996 s]
  Range (min … max):    8.053 s … 10.938 s    10 runs
 
Benchmark 5: mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 1C
  Time (mean ± σ):      8.568 s ±  0.515 s    [User: 17.955 s, System: 0.942 s]
  Range (min … max):    7.682 s …  9.537 s    10 runs
 
Summary
  'mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 1C' ran
    1.01 ± 0.10 times faster than 'mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 4'
    1.03 ± 0.09 times faster than 'mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 6'
    1.08 ± 0.13 times faster than 'mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 8'
    1.18 ± 0.10 times faster than 'mvn net.revelc.code.formatter:formatter-maven-plugin:2.18.0:format -T 2'

与versions-maven-plugin的比较:

$ hyperfine -L threads 2,4,6,8,1C -p 'git co -- .' 'mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T {threads}'
Benchmark 1: mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 2
  Time (mean ± σ):      1.581 s ±  0.104 s    [User: 4.641 s, System: 0.198 s]
  Range (min … max):    1.513 s …  1.863 s    10 runs
 
Benchmark 2: mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 4
  Time (mean ± σ):      1.575 s ±  0.031 s    [User: 4.627 s, System: 0.190 s]
  Range (min … max):    1.527 s …  1.623 s    10 runs
 
Benchmark 3: mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 6
  Time (mean ± σ):      1.572 s ±  0.034 s    [User: 4.608 s, System: 0.195 s]
  Range (min … max):    1.530 s …  1.623 s    10 runs
 
Benchmark 4: mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 8
  Time (mean ± σ):      1.558 s ±  0.031 s    [User: 4.589 s, System: 0.192 s]
  Range (min … max):    1.481 s …  1.586 s    10 runs
 
Benchmark 5: mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 1C
  Time (mean ± σ):      1.565 s ±  0.024 s    [User: 4.597 s, System: 0.196 s]
  Range (min … max):    1.533 s …  1.600 s    10 runs
 
Summary
  'mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 8' ran
    1.00 ± 0.03 times faster than 'mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 1C'
    1.01 ± 0.03 times faster than 'mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 6'
    1.01 ± 0.03 times faster than 'mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 4'
    1.01 ± 0.07 times faster than 'mvn versions:set -DnewVersion=1.0.0-SNAPSHOT -DgenerateBackupPoms=false -T 2'

这里可以看到不同-T ..

没有区别

I want something that runs from the terminal, to perform checks in CI, to clean the codebase after git merges,

您可以仅通过目标在命令行上调用一些目标。 (插件必须始终正确执行。)

to clean the codebase after git merges,

如果您有两种格式正确的代码状态,合并将不会更改格式(假设自动合并会起作用)。除了无法自动完成的冲突(这是 IDE 的工作)。

如果格式不正确,您可能会破坏构建。

I assumed that it triggered a parallel processing of modules.

并行化基于模块级别

That maven would follow the order of dependencies seemed logical.

是的,反应器的顺序由 Maven 分析。

It is interesting that you mention this can be controlled per plugin. Do you have any link to that I can read, please?

插件可以简单地读取其上的 pom 文件,从而绕过 reactor 的信息...有些插件会这样做 (versions-maven-plugin),这意味着插件可以自己做所有事情,但会重复逻辑这已经在 Maven 本身中实现了。

更新:versions-maven-plugin 不会覆盖反应器,它没有考虑到此信息的存在。它只是在自己工作