Maven-跳过父项目生成

Maven-跳过父项目生成,maven,skip,parent-pom,maven-reactor,Maven,Skip,Parent Pom,Maven Reactor,我知道一天要问两次,但这里有另一个Maven难题: 我有一个父POM,它定义了5个模块(5个子项目)。由于每个模块的执行方式都完全相同,因此我将部分拉入父POM以消除重复的代码。现在-如果我从每个模块分别执行build,它会工作,但是如果我想一次构建所有模块并移动到父目录,我会出错,因为Maven尝试执行的第一件事就是父项目本身: mvn package -P release [INFO] Scanning for projects... [INFO] Reactor build order:

我知道一天要问两次,但这里有另一个Maven难题:

我有一个父POM,它定义了5个模块(5个子项目)。由于每个模块的执行方式都完全相同,因此我将
部分拉入父POM以消除重复的代码。现在-如果我从每个模块分别执行build,它会工作,但是如果我想一次构建所有模块并移动到父目录,我会出错,因为Maven尝试执行的第一件事就是父项目本身:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects
之后构建失败,因为exec插件试图执行一些不存在的东西。从输出来看,很明显reactor插件正在驱动构建,但是如何配置reactor以跳过父级呢


另外,为了防止混淆-我试图在
相同的
构建过程中禁止在父级上执行概要文件,并在子级上启用它您不能跳过父级构建,但您可以将概要文件配置为不被激活,只需稍加修改。显示如何通过存在或不存在基于文件的
元素来控制配置文件的激活。通过这种方式,您可以在父级中定义配置文件,但由于标记文件存在于父级中,因此可以在该项目中将其停用。子项目的源中不会有标记文件,因此将为这些项目激活配置文件

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

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

测试
src/main/resources/test.marker
...

构建父对象有什么问题

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

  • 父POM
  • 模块聚合
第一个是对所有孩子的共同点的定义。您可以将父级定义为pom打包项目,并可以将其安装到存储库中

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

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

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

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


编辑,感谢RichSeller的评论


关于多模块(聚合项目)和继承(父项目)之间的差异的完整解释可以在Maven的书中找到。

我想说明我的情况有部分折衷(感谢Maven用户邮件列表中的家伙们的建议)。基本上你需要把轮廓切成两块。插件的可重用
配置
部分转到父POM,而
执行
保留在子POM中。然后子文件中的概要文件插件被标记为
继承的
,瞧,在运行时父文件没有执行,因为它缺少
执行
部分。这远非理想,但确实有效。例如,我无法实现上面Rick Seller提供的“缺失”文件解决方案。似乎一旦设置了激活/非激活状态,即使模块中缺少标记文件,配置文件的状态也不会改变。然而,这是我的问题的确切解决方案。警告:这仅适用于Maven 2.1+

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

  • 母公司
  • 嘘声
  • 要跳过父构建,我需要做的就是添加这个命令行开关

    mvn安装–rf foo


    或者,您可以使用
    --从
    恢复它将做的是跳过父项并从foo模块向下继续。现在-我正在调查是否可以通过配置Reactor插件来实现这一点(P.S.-不,不行),但即使使用交换机,上述场景对我来说也很好

    这是@romaintaz对同一问题的回答所暗示的

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

    pom
    
    +1要指出这一点,请参阅Maven书籍了解更多详细信息:是的,我想指出这一点,因为人们通常认为聚合和父项目是同一件事,不能单独使用。构建父项目有什么错?简单-概要文件中发生的事情适用于孩子,但对家长来说没有意义。说到你的观点,我需要两者:聚合和提取可重用代码的能力。配置文件激活-正如富卖家所评论的,这是一个完美的解决方案,或者可能是一个完美的解决方案。到目前为止,我还不能让它富有——这就是我想要的答案!说到romanitaz——我想要两者:聚合和将公共代码拉到父级的能力(对父级来说执行这些代码毫无意义)。Rich——如果我能再麻烦你一点的话。我试图通过使用属性而不是缺少文件来实现相同的效果。它不起作用。即使我把财产申报单贴在孩子的POM上
    <packaging>pom</packaging>