Maven - Child 模块配置文件
Maven - Child Module Profiles
问题
我有一个 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)
只有 children B1 和 B2 必须使用包含一些额外构建内容的特定配置文件构建.因此,配置文件已在模块 B 中指定。
逻辑上模块属于模块B并且还继承了一些依赖关系等(聚合+继承)。
(假设 B = 前端,B1 = UI,B2 = 主题,B3 = 其他)
问题
- 是否有可能仍然使用来自 parent 的 完整版本
pom 并仅在正确的位置激活相应的配置文件
child仁? (将是我最喜欢的解决方案)
- 或者我需要使用高级反应堆单独构建
选项(-pl 等)?
- 或者对于这种情况是否有完全不同的方法?
编辑
编辑,因为问题被确定为 :
问题是相应问题中提到的解决方案不起作用。
如果我使用 属性 激活子配置文件,它也会为 模块 B(parent)和ALLchildren.
我只希望它在 child B1 和 B2.
期间有效
如果你想要一个应该应用于子模块(并且只有其中的一些)的配置文件,在它们的父项目(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 执行的插件配置全局插件配置(作为其打包和默认构建的一部分),您可以重新定义其执行以覆盖 .
请注意,我们可以使用 skip
配置元素完成相同的操作,但是:
- 并非所有插件都提供
skip
配置条目
- 使用
phase
元素与任何配置无关,可以重复用于附加到同一阶段的执行
问题
我有一个 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)
只有 children B1 和 B2 必须使用包含一些额外构建内容的特定配置文件构建.因此,配置文件已在模块 B 中指定。
逻辑上模块属于模块B并且还继承了一些依赖关系等(聚合+继承)。
(假设 B = 前端,B1 = UI,B2 = 主题,B3 = 其他)
问题
- 是否有可能仍然使用来自 parent 的 完整版本 pom 并仅在正确的位置激活相应的配置文件 child仁? (将是我最喜欢的解决方案)
- 或者我需要使用高级反应堆单独构建 选项(-pl 等)?
- 或者对于这种情况是否有完全不同的方法?
编辑
编辑,因为问题被确定为
如果我使用 属性 激活子配置文件,它也会为 模块 B(parent)和ALLchildren.
我只希望它在 child B1 和 B2.
期间有效如果你想要一个应该应用于子模块(并且只有其中的一些)的配置文件,在它们的父项目(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 执行的插件配置全局插件配置(作为其打包和默认构建的一部分),您可以重新定义其执行以覆盖
请注意,我们可以使用 skip
配置元素完成相同的操作,但是:
- 并非所有插件都提供
skip
配置条目 - 使用
phase
元素与任何配置无关,可以重复用于附加到同一阶段的执行