2009-10-01 82 views
18

我知道这是mauvais ton在一天问两次,但这里的另一个Maven的益智游戏:的Maven - 跳过父项目建设

我有一个定义了5个模块(5个子项目)父POM。由于每个模块的执行方式与我将<profile><build>部分拉到父POM中的方式完全相同,所以可以摆脱重复的代码。现在 - 如果我从每个模块单独执行构建,它会工作,但是如果我想一次构建所有模块并移动到父目录,则自从Maven尝试执行的第一件事是父项目本身以来,出现错误:

mvn package -P release 
[INFO] Scanning for projects... 
[INFO] Reactor build order: 
[INFO] DWD Parent project 
[INFO] Projects 

之后,构建失败,因为exec插件试图执行不存在的东西。看看输出,很明显的是反应器插件正在推动构建,但我如何配置反应器来跳过父项?

P.S.为了防止混淆 - 我试图禁止在父级上的配置文件执行,并在same构建构建

+0

底线:行家缺乏支持成分,不可能的,如果你只从父 – sibidiba 2014-10-18 12:07:26

回答

9

构建父项时出了什么问题?

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

  • 父POM
  • 模块聚集

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

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

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

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

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


编辑,感谢RichSeller评论

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

+0

+1来指出这一点,请参阅Maven书籍了解更多详情:http://www.sonatype.com/books/maven-book/reference/ pom-relationships-sect-multi-vs-inherit.html – 2009-10-01 08:27:24

+0

是的,我想指出一点,因为一般人认为聚合和父项目是相同的东西,不能单独使用。 – romaintaz 2009-10-01 08:33:54

+2

构建父项时出现了什么问题?简单 - 配置文件中发生的情况适用于儿童,但对于父母无效。为了您的观点 - 我需要:聚合和能够拉出可重复使用的代码。配置文件激活 - 正如Rich Seller所评论的那样是完美的解决方案 – Bostone 2009-10-01 15:44:52

14

在子级上启用它。您不能跳过父构建,但您可以配置该配置文件不被激活一点点黑客。 This answer显示了如何通过是否存在基于文件的元素来控制配置文件的激活。这样,您可以在父项中定义配置文件,但由于父项中存在标记文件,因此可以在该项目中将其取消激活。子项目的源代码中没有标记文件,因此将为这些项目激活配置文件。

更新说明:在我的测试项目中,此配置表示配置文件在父项目(具有src/main/resources中的文件)中处于停用状态,但在其所有没有文件的子项目中激活资源目录。

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

富建 - 这就是我想要的答案!至于romanitaz的观点 - 我希望:聚合和能够将常用代码拉到父代(执行代码毫无意义)。 – Bostone 2009-10-01 15:42:09

+0

富有 - 如果我可以打扰你一点点。我试图通过使用属性而不是丢失的文件来达到相同的效果。它不起作用。即使将财产声明粘贴到我孩子的POM中,我的个人资料也不会被激活。这是为什么?属性是否声明为“预建”并且不会重置?也许我应该问另一个问题,以便我可以把代码示例? – Bostone 2009-10-01 15:48:11

+0

不,它应该基于财产存在激活(http://maven.apache.org/guides/introduction/introduction-to-profiles.html上有一个示例),如果您无法获得,请随时提出另一个问题它工作 – 2009-10-01 15:58:58

4

我想证明我的情况存在部分妥协(感谢maven用户邮件列表中的建议)。基本上你需要切成两块的形状。可重复使用的configuration部分插件转到父POM,并且executions停留在子POM中。然后,该子项中的配置文件插件被标记为inherited,瞧 - 在运行时父配置文件不会被执行,因为它缺少executions部分。这远非理想,但确实奏效。例如to this link

+0

有趣的是,感谢您在此发布此信息。但是,链接是否起作用,还是仅仅是我? – 2009-10-02 22:46:29

+0

适用于我,但你可以尝试完整版 http://mail-archives.apache.org/mod_mbox/maven-users/200812.mbox/%[email protected]%3E – Bostone 2009-10-03 00:21:14

+0

完整版的作品,不是缩短的。谢谢。 – 2009-10-03 01:00:30

2

我无法实现上面Rick Seller提供的“缺少”文件解决方案。似乎一旦设置配置文件的活动/非活动状态将不会改变,即使模块中缺少标记文件。但是,这是我的问题的确切解决方案。警告:这是只可与Maven 2.1+

开始。如果我有2个模块父POM定义:foo和常规情况下再嘘执行顺序将是:

  1. FOO

所有我需要做的,跳过父生成是添加此命令行开关

mvn install –rf foo

或者,您可以使用--resume-from它将做的是跳过父母并从foo模块继续。现在 - 我们正在调查这是否可以通过配置Reactor插件实现(PS - 不,不可能的)但即使有开关,上面的场景中工作正常,我

1

这是由@ romaintaz的回答暗示到相同的问题,Maven - skip parent project build

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

<packaging>pom</packaging>