在我们的项目中,Maven构建为相应的文件夹结构中的不同模块(例如jar,console,car等)生成工件。
每次我们检查代码时,即使“控制台”模块中只有更改,构建也会创建全新的工件。
是否有任何Maven插件或仅生成自上次成功构建后更改的工件的方法?
例如,如果我更改了“console”模块的代码,那么生成的工件应该只在其相应的文件夹中有控制台文件。
答案 0 :(得分:5)
如果您在命令行上,则可以使用
mvn -pl moduleToBuild
可与以下内容结合使用:
mvn -pl moduleToBuild -am
还将构建 moduleToBuild 的依赖关系。
如果您使用的是像jenkins这样的CI解决方案,则会出现一个复选框来激活此行为。这可以在Maven配置部分增量构建 - 仅构建已更改的模块下找到。
您必须在多模块构建的根目录上启动maven调用。
答案 1 :(得分:1)
您可能希望查看使用maven reactor plugin的reactor:make-scm-changes目标。 This link有关于如何使用它的示例。
答案 2 :(得分:1)
我一直在寻找可以检查与“上游”版本相比我更改了哪些文件的内容,并构建包含这些文件的所有Maven模块,并且所有模块都依赖于它们。
由于reactor:make-scm-changes
似乎没有这样做,一种方法(Linux Bash方式)是
git diff --name-only master...
),pom.xml
为所有人,... | sort | uniq
),--project-list
和--also-make
其余的是使用管道和功能将它们连接在一起
当然,这假设所有来源都在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
)。