代码之家  ›  专栏  ›  技术社区  ›  Ran

Maven多模块项目-如何在所有子模块完成后运行操作

  •  8
  • Ran  · 技术社区  · 14 年前

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

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

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

    我的第一个尝试是将调用createrepo命令的antrun挂接到父pom(超级pom)上。 部署 阶段。我做到了,问题是父级的部署阶段运行 之前 子模块的部署阶段。我想让它跑起来 之后
    因为部署阶段是生命周期的最后一个阶段,所以我不能将createrepo antrun附加到任何其他后期阶段。

    所以我的问题是:在所有子模块的构建操作都成功结束之后,有没有办法运行一个“cleanup”antrun或者一个通常只执行一次的插件?

    解决这个问题的方法是创建另一个子模块,并通过使它依赖于所有其他模块来确保它是最后一个子模块,然后从这个模块的部署阶段运行createrepo但这很难看也很难维持。我喜欢更干净的解决方案。

    谢谢

    Maven版本是2.2.1

    2 回复  |  直到 14 年前
        1
  •  3
  •   Gary    14 年前

    我不太确定你最后的建议是创建一个依赖于所有其他模块的专用模块是多么难看毕竟,它利用了maven的依赖管理。您可以用一种非常明显的方式命名它,让维护人员清楚地知道发生了什么,它将很好地适应项目的整个构建过程。

    为什么不把它放在适当的位置,看看它对你有多好?记住,工作代码每次都比不工作的代码好。

        2
  •  0
  •   Dejan Menges    12 年前

    我使用的解决方案是将建筑和包装从发布内容中分离出来。当我们使用jenkins时,每个构建都会调用publish job,而publish job同时处理createrepo的内容,更妙的是jenkins还允许您在paralel中运行这个publish job。

    棘手的是,实际上在createrepo阶段,如果两个作业在完全相同的时刻运行,那么其中一个作业将失败,因为它们不能在同一组文件的同一个文件夹中执行相同的操作。不过,我在这里实现flock只是为了createrepo阶段,现在所有的作业都在paralel中运行,另外三个发布版本也在paralel中进行了测试,但是由于其他一些决定,我们使用了两个。

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