Maven - 跳过父项目构建

时间:2009-10-01 00:08:41

标签: maven skip parent-pom maven-reactor

我知道 mauvais ton 在一天内要求两次,但这是另一个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插件尝试执行不存在的内容。看一下输出很明显反应堆插件正在驱动构建但是如何配置reactor来跳过父代?

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

5 个答案:

答案 0 :(得分:14)

您不能跳过父版本,但您可以将配置文件配置为不通过一点点黑客激活。 This answer显示了如何通过基于文件的<activation>元素的存在与否来控制配置文件的激活。这样,您可以在父项中定义配置文件,但在该项目中将其取消激活,因为父项中存在标记文件。子项目的源文件中没有标记文件,因此将为这些项目激活配置文件。

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

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

答案 1 :(得分:10)

构建父级有什么问题?

事实上,在Maven中,有两个不同的概念(通常同时使用):

  • 父POM
  • 模块聚合

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

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

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

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

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


编辑,感谢RichSeller评论

可以在Maven书籍here中找到多模块(聚合项目)和继承(父项目)之间差异的完整说明。

答案 2 :(得分:4)

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

答案 3 :(得分:2)

我无法实现上述Rick Seller提供的“缺失”文件解决方案。似乎一旦设置活动/非活动状态的配置文件将不会被更改,即使模块中缺少标记文件。然而,这是我的问题的确切解决方案。警告:这仅适用于Maven 2.1 +

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

  1. FOO
  2. BOO
  3. 我需要做的就是跳过父版本是添加这个命令行开关

    mvn install –rf foo

    或者你可以使用--resume-from它将做什么是跳过父节点并从foo模块继续。现在 - 我正在调查是否可以通过配置Reactor插件(P.S。 - 不能它)来实现这一点,但即使使用开关,上面的场景也适用于我

答案 4 :(得分:1)

@ romaintaz对同一问题的回答暗示了这一点,Maven - skip parent project build

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

<packaging>pom</packaging>