问题
我有一个maven项目,其结构与下面的相似:
(为了便于说明而简化)
--parent
|-- child A (inherits from parent)
|-- child B (inherits from parent)
|-- child B1 (inherits from B)
|-- child B2 (inherits from B)
|-- child B3 (inherits from B)
儿童 B1 和 B2 必须使用包含一些额外构建内容的特定配置文件构建。因此,配置文件已在模块 B 中指定。
逻辑模块属于模块 B ,并且还继承了一些依赖项等。(aggreagtion + inheritance)。
(想象一下像B = Frontend,B1 = UI,B2 =主题,B3 =其他东西)
问题
修改
编辑,因为问题已标识为duplicate: 问题是相应问题中提到的解决方案不起作用。
如果我使用属性激活子配置文件,它也将被激活模块B (父级)和所有子级。
我只希望它对孩子 B1 和 B2 有效。
答案 0 :(得分:11)
如果你想要一个应该应用于子模块的配置文件(并且只有一些模块),在它们的父项目(pom)中以集中方式定义,但是没有将配置文件应用于父项本身,这里是一种提议的方法:
在父pom中定义配置文件,样本一:
<profiles>
<profile>
<id>sample-profile</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>print-hello</id>
<phase>${phase.prop}</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message="hello there!" />
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
请注意我们正在做的事情:
phase
元素已参数化,因此插件与构建阶段的绑定也将进行参数化所以,在同一个父pom中,让我们定义属性:
<properties>
<phase.prop>none</phase.prop>
</properties>
因此,在父pom上运行的构建会将插件执行附加到无阶段(none
不是关键字或已知值,只是用于非现有阶段的事实标准,您可以把它留空或者把它放在你喜欢的任何值上,它会产生相同的效果)并因此跳过它。在所有声明的模块中,默认情况下也会跳过它。该配置文件在每个模块中仍然处于活动状态,但由于默认情况下它不会执行任何插件,因此无害。
然后,在您希望插件执行处于活动状态的模块中,您可以仅重新定义相关属性和所需阶段:
<properties>
<phase.prop>package</phase.prop>
</properties>
然后从主构建(父级)激活配置文件
mvn clean install -Psample-profile
父级会将其应用于所有模块,但有效的配置文件执行只会在phase.prop
值具有maven意义值的情况下执行。
如果您需要为不同的插件执行设置不同的阶段,那么您可以定义多个属性并应用相同的模式。
如果您没有插件执行,而是已经由Maven执行的插件的全局插件配置(作为其打包和默认构建的一部分),您可以重新定义其执行覆盖{{3} }。
请注意,我们可以使用skip
配置元素完成相同的操作,但是:
skip
配置条目phase
元素与任何配置无关,可以重复用于附加到同一阶段的执行