Maven构建仅生成更改的工件

时间:2012-12-04 12:08:08

标签: maven maven-plugin

在我们的项目中,Maven构建为相应的文件夹结构中的不同模块(例如jar,console,car等)生成工件。

每次我们检查代码时,即使“控制台”模块中只有更改,构建也会创建全新的工件。

是否有任何Maven插件或仅生成自上次成功构建后更改的工件的方法?

例如,如果我更改了“console”模块的代码,那么生成的工件应该只在其相应的文件夹中有控制台文件。

4 个答案:

答案 0 :(得分:5)

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

mvn -pl moduleToBuild

可与以下内容结合使用:

mvn -pl moduleToBuild -am

还将构建 moduleToBuild 的依赖关系。

如果您使用的是像jenkins这样的CI解决方案,则会出现一个复选框来激活此行为。这可以在Maven配置部分增量构建 - 仅构建已更改的模块下找到。

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

答案 1 :(得分:1)

您可能希望查看使用maven reactor pluginreactor:make-scm-changes目标。 This link有关于如何使用它的示例。

答案 2 :(得分:1)

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

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

  1. list the changed files,使用(git diff --name-only master...),
  2. find the nearest pom.xml为所有人,
  3. 重复数据删除(... | sort | uniq),
  4. 使用--project-list--also-make
  5. 将其作为列表提供给Maven

    其余的是使用管道和功能将它们连接在一起 当然,这假设所有来源都在pom.xml的文件夹中,这通常是正确的。

答案 3 :(得分:0)

以下是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)。