20

我知道一天内问两次很麻烦,但这是另一个 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 插件试图执行一些不存在的东西。查看输出,很明显反应器插件正在驱动构建,但我如何配置反应器以跳过父级?

PS为了防止混淆 - 我试图抑制父级的配置文件执行并在same构建期间在子级上启用它

4

5 回答 5

17

您不能跳过父版本,但您可以将配置文件配置为不通过小技巧激活。这个答案<activation>显示了如何通过基于文件的元素的存在或不存在来控制配置文件的激活。这样,您可以在父项中定义配置文件,但由于父项中存在标记文件,因此在该项目中将其停用。子项目的源中没有标记文件,因此将为这些项目激活配置文件。

更新以澄清:在我的测试项目中,此配置意味着配置文件在父项目(在 src/main/resources 中有文件)中被停用,但在所有资源目录中没有文件的子项目中被激活。

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>
于 2009-10-01T07:03:47.710 回答
11

建立父母有什么问题?

其实在Maven中,有两个不同的概念(一般同时使用):

  • 父 POM
  • 模块聚合

第一个是对所有孩子共有的一切的定义。您将父项目定义为 pom 打包项目,并且可以将其安装在存储库中。

当您构建这个父级的子级时,Maven2 将检索这个父级以将父级 pom 与子级 pom 合并。您可以通过运行命令查看整个 pom.xml mvn help:effective-pom

在这种情况下,不会构建父 pom,只会从存储库中检索它。

第二种情况是一个包含modules子项目列表的项目。原则是您在该项目上运行的每个命令也将在所有子模块上运行。模块的顺序将由 Reactor 定义,它将查看模块间的依赖关系以找出必须在其他模块之前构建的模块。如果没有依赖项,那么它将采用父 pom.xml 中定义的模块列表。

在这种情况下,如果您在根项目上运行命令,Maven2 将首先构建根项目,然后再构建子模块。您不能跳过根项目的创建。


编辑,感谢 RichSeller 评论

多模块(聚合项目)和继承(父项目)之间的区别的完整解释可以在 Maven 书中找到,这里

于 2009-10-01T07:21:52.273 回答
4

我想记录下我的情况存在部分妥协(感谢 Maven 用户邮件列表中的人提供建议)。基本上你需要把轮廓切成两块。插件的可重用configuration部分转到父 POM,并executions保留在子 POM 中。然后子中的配置文件插件被标记为inherited并且瞧 - 在运行时父配置文件没有执行,因为它缺少executions部分。这远非理想,但确实有效。例如参考这个链接

于 2009-10-02T04:56:11.863 回答
3

我无法实施上面 Rick Seller 提供的“丢失”文件解决方案。似乎一旦设置了配置文件的活动/非活动状态,即使模块中缺少标记文件,也不会更改。但是,这是我的问题的确切解决方案。警告:这仅从 Maven 2.1+ 开始可用

如果我有一个定义了 2 个模块的父 POM:foo 和 boo,那么在常规情况下,执行顺序将是:

  1. 父母

跳过父构建我需要做的就是添加这个命令行开关

mvn install –rf foo

或者,您可以使用--resume-fromWhat it will do is to skip parent and continue from foo module down。现在 - 我正在调查这是否可以通过配置 Reactor 插件来实现(PS - 不,它不能)但即使使用开关,上述场景对我来说也很好

于 2009-10-06T17:28:39.717 回答
1

@romaintaz 对同一问题Maven 的回答暗示了这一点 - 跳过父项目构建

但为了明确这一点,在父 pom 中,必须将包装元素指定为 pom(而不是 jar 或 war)。
例子:

<packaging>pom</packaging>
于 2011-07-25T11:32:12.280 回答