【问题标题】:Maven multi-module project - how to run an operation after all submodules have finishedMaven多模块项目-所有子模块完成后如何运行操作
【发布时间】:2010-11-15 12:13:47
【问题描述】:

我有一个多模块 maven 项目,我希望能够在所有子模块完成执行后运行操作 (antrun)。

在我的项目中,我从每个子模块构建 RPM,在部署阶段,我将 RPM(通过 ssh)复制到 RPM 存储库。
RPM 存储库要求我在添加新 RPM 后运行 createdb 命令,以便它可以索引它们。
所以我有一个实际运行 scp 并将 RPM 复制到 repo 的 antrun。它为每个实际产生 RPM 的子模块运行,并与 maven deploy 阶段挂钩。我能做的是在每个 scp 运行 createrepo 命令之后,但这会很浪费,我有 10 多个子模块,每个 createrepo 大约需要一分钟,所以我会浪费宝贵的构建时间。

我想做的是在所有子模块完成之后,然后运行 ​​createrepo。一次。

我的第一次尝试是将调用 createrepo 命令的 antrun 挂接到父 pom(超级 pom)的 deploy 阶段。我这样做了,问题是父级的部署阶段在子模块的部署阶段之前运行。我希望它在之后运行
我无法将 createrepo antrun 附加到任何其他后期阶段,因为部署阶段是生命周期中的最后一个阶段。

所以我的问题是:在所有子模块的所有构建操作都成功结束后,有没有办法运行“清理”antrun 或一般会执行一次的插件?

解决它的方法是创建另一个子模块,并通过使其依赖于所有其他模块并从该模块的部署阶段运行 createrepo 来确保它是最后一个。但这很丑陋且难以维护。我更喜欢更清洁的解决方案。

谢谢

Maven 版本是 2.2.1

【问题讨论】:

  • 你有没有想出更好的解决方案?

标签: java maven-2


【解决方案1】:

我不太确定您创建依赖于所有其他模块的专用模块的最终建议是否如此丑陋。毕竟,它利用了 Maven 的依赖管理。您可以以一种非常明显的方式命名它,以便让维护人员清楚地知道发生了什么,并且它将很好地适应项目的整体构建过程。

为什么不把它放在适当的位置,看看它对你的效果如何?请记住,工作代码每次都胜过漂亮但无法工作的代码。

【讨论】:

  • 我的音乐会是维护(添加新模块时),这与 hack 有多么明显。如果没有其他内置且明显的解决方案,我会这样做
  • 我同意,专门为此任务命名的模块很有意义。您也可以将它放在单独的配置文件中,以便它仅针对特定部署运行。
【解决方案2】:

我正在使用将构建和打包与发布内容分开的解决方案。当我们使用 Jenkins 时,每个构建都会调用发布作业,该作业也处理 createrepo 的内容,更好的是 Jenkins 还允许您并行运行此发布作业。

棘手的是,实际上在 createrepo 阶段,如果两个作业在完全相同的时刻运行,当然一个会失败,因为它们不能在同一文件夹中对同一组文件执行相同的操作。但是,我在这里仅为 createrepo 阶段实施了flock,现在所有作业都真正并行运行,另外还测试了三个并行发布,但由于其他一些决定,我们使用了两个。

但是,使用这种方法,我们将 20 多个构建的总构建时间从 1.5 小时减少到 15 分钟。

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多