Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven多模块项目-如何在所有子模块完成后运行操作_Java_Maven 2 - Fatal编程技术网

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

Java Maven多模块项目-如何在所有子模块完成后运行操作,java,maven-2,Java,Maven 2,我有一个多模块maven项目,我希望能够在所有子模块完成执行后运行一个操作(antrun) 在我的项目中,我从每个子模块构建RPM,并在部署阶段(通过ssh)将RPM复制到RPM存储库中。 RPM repo要求我在添加新RPM后运行createdb命令,以便它可以对它们进行索引。 因此,我有一个antrun,它实际运行scp并将RPM复制到回购协议。它为每个实际产生RPM的子模块运行,并连接到mavendeploy阶段。我能做的是在每个scp运行createrepo命令之后,但那是浪费,我有10

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

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

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

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

所以我的问题是:有没有一种方法可以运行一个“清理”antrun或一个插件,在所有子模块的所有构建操作成功结束后,它通常只执行一次

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

谢谢


Maven版本是2.2.1

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


为什么不把它放在适当的地方,看看它对你有多好?请记住,工作代码每次都胜过漂亮但不工作的代码。

我使用的解决方案是将构建和打包从发布内容中分离出来。当我们使用Jenkins时,每个构建都会调用publish job,它也处理createrepo的内容,更棒的是Jenkins允许您并行运行这个publish job

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


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

我的任务是维护(当添加新模块时),而v/s是一个多么明显的黑客行为。如果没有其他内置的和明显的解决方案,我会同意这一点。我同意,专门为此任务命名的模块非常有意义。你也可以把它放在一个单独的配置文件中,这样它就只在一个特定的部署中运行。你有没有想出更好的解决方案?