Maven - 跳过父项目构建
-
19-09-2019 - |
题
我知道这是 莫韦顿 一天问两次,但这是另一个 Maven 难题:
我有一个父 POM,它定义了 5 个模块(5 个子项目)。由于每个模块的执行方式与我拉取的方式完全相同 <profile><build>
将其放入父 POM 中以消除重复的代码。现在 - 如果我从每个模块中单独执行构建,它就可以工作,但是如果我想一次构建所有模块并移动到父目录,我会收到错误,因为 Maven 尝试执行的第一件事是父项目本身:
mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] DWD Parent project
[INFO] Projects
之后构建失败,因为 exec 插件尝试执行不存在的东西。查看输出,很明显反应器插件正在驱动构建,但如何配置反应器以跳过父级?
附:为了防止混淆 - 我试图抑制父级上的配置文件执行并在子级上启用它 same
建造
解决方案
构建父级有什么问题?
其实在Maven中,有两个不同的概念(一般是同时使用的):
- 父 POM
- 模块聚合
第一个是对所有孩子共有的一切的定义。您将父项目定义为 pom 打包的项目,然后可以将其安装在存储库中。
当您构建此父项的子项时,Maven2 将检索此父项以将父项 pom 与子项 pom 合并。您可以通过运行命令查看整个 pom.xml mvn help:effective-pom
.
在这种情况下,不会构建父 pom,只会从存储库中检索它。
第二种情况是一个项目,其中包含 modules
子项目清单。原则是您在此项目上运行的每个命令也将在所有子模块上运行。模块的顺序将由 Reactor 定义,它将查看模块间的依赖关系,以找出必须在其他模块之前构建哪个模块。如果没有依赖项,那么它将采用父 pom.xml 中定义的模块列表。
在这种情况下,如果您在根项目上运行命令,Maven2 将首先构建根项目,然后构建子模块。你 不能 跳过根项目的创建。
编辑,感谢 RichSeller 评论
关于多模块(聚合项目)和继承(父项目)之间差异的完整解释可以在Maven书中找到, 这里.
其他提示
您不能跳过父生成,但您可以配置为不带一点黑客被激活的配置文件。 这个答案说明如何通过控制配置文件的激活存在或不存在基于文件的<activation>
元件。这样,您就可以定义在父配置文件,但有它在该项目中停用,因为标记文件存在于父。子项目不会有在它们的源标记文件,所以简档将这些项目被激活。
更新,以澄清:在我的测试项目中此配置是指分布在父项目(在SRC /主/资源文件)激活,但激活那些没有在他们的资源文件中的所有子项目目录。
<profile>
<id>test</id>
<activation>
<file>
<missing>src/main/resources/test.marker</missing>
</file>
</activation>
...
</profile>
我要记录的是有部分妥协,我的情况(2009年,由于Maven用户邮件的建议名单的家伙)。基本上你需要在两片砍轮廓。插件的可重复使用的configuration
部分转到父POM,并executions
停留在孩子POM。然后在子型材插件标记为inherited
,瞧 - 在运行时,因为它缺少executions
部分不执行父轮廓。这是很不理想,但它确实工作。请参阅这个链接例如
我无法实现上面 Rick Seller 提供的“丢失”文件解决方案。似乎一旦设置了配置文件的活动/非活动状态,即使模块中缺少标记文件,也不会更改。然而,这是我的问题的确切解决方案。警告:这仅从 Maven 2.1+ 开始可用
如果我有一个定义了 2 个模块的父 POM:foo 和 boo 那么在正常情况下执行顺序将是:
- 家长
- 富
- 嘘
要跳过父构建,我所需要做的就是添加此命令行开关
mvn install –rf foo
或者你可以使用 --resume-from
它将执行的操作是跳过父级并从 foo 模块向下继续。现在 - 我正在研究是否可以通过配置 Reactor 插件来实现这一点 (附注- 不,不能) 但即使使用开关,上述场景对我来说也很好用
这是由@ romaintaz的回答暗示了同样的问题, Maven的 - 跳父项目构建
但只是为了更加明确,在父POM您指定的包装元素为POM(而不是JAR或战争),它的当务之急。结果 例如:
<packaging>pom</packaging>