6

In our project, Maven build generates artifacts for different modules i.e. jar, console, car etc in corresponding folder structure.

Everytime we check in the code, the build genarates full new artifacts even if there is only change in "console" module.

Is there any Maven plugin or a way to generate only the artifacts which were changed since last successful build?

For instance, if I have changed the code for "console" module, then the artifact generated should only have console file in its corresponding folder.

4

4 回答 4

5

如果你在命令行上,你可以使用

mvn -pl moduleToBuild

可以结合:

mvn -pl moduleToBuild -am

这还将构建moduleToBuild的依赖项。

如果您在 jenkins 之类的 CI 解决方案中,则有一个复选框可以激活此行为。这可以在 Maven 配置部分Incremental build-only build changed modules下找到。

您必须在多模块构建的根目录上启动 maven 调用。

于 2012-12-04T12:50:08.880 回答
1

您可能想查看使用maven reactor 插件reactor:make-scm-changes目标。这个链接有关于如何使用它的例子。

于 2012-12-04T12:26:53.337 回答
1

这是 Ondra Žižka 提到的方法的一个示例,使用 mvn clean install 和 bash。

请注意,它忽略了 pom 打包模块(因为它们通常是子树的根,通常会导致构建额外的、不必要的模块。它还会查找 3 级深度的 pom.xml 文件(为了速度),假设它们都是相同的反应器,但这可以根据您的项目进行调整。

find . -maxdepth 3 -name pom.xml | xargs -I{} grep -iL -F "<packaging>pom</packaging>" {} | xargs dirname | grep -v target | sed -e 's/^.[/]*//g' | grep . > /tmp/mvn-modules.txt && git diff --name-only @{u}...HEAD | grep -o -F -f /tmp/mvn-modules.txt | xargs | tr ' ' ',' | xargs -I{} mvn clean install -U -pl {} -amd 

在示例中,参考了当前分支与上游相比的更改,但如果这更合适@{u}...HEAD,可以将其交换为另一个差异(示例)。<branchname> master

于 2018-03-10T06:34:17.647 回答
1

我一直在寻找可以检查与“上游”版本相比我更改了哪些文件的东西,并构建了所有包含这些文件的 Maven 模块,并且都依赖于它们。

由于reactor:make-scm-changes似乎没有这样做,因此一种方法(Linux Bash 方式)是

  1. 使用 ( git diff --name-only master...)列出更改的文件,
  2. 为所有人找到最近pom.xml的,
  3. 去重 ( ... | sort | uniq),
  4. --project-list使用, 和--also-make.将其作为列表提供给 Maven

剩下的就是使用管道和函数将它连接在一起。
当然,这假设所有源都在带有 的文件夹中pom.xml,这通常是正确的。

于 2017-09-21T08:17:16.800 回答