Maven-跳过父项目生成
我知道一天要问两次,但这里有另一个Maven难题: 我有一个父POM,它定义了5个模块(5个子项目)。由于每个模块的执行方式都完全相同,因此我将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:
部分拉入父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>