Maven - 子模块配置文件

12
问题:
我有一个 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)

Only B1 and B2 need to be built using a specific profile that includes additional build materials. As a result, the profile has been defined in module B. Logically, the modules belong to module B and also inherit some dependencies through aggregation and inheritance. (Imagine something like B=Frontend, B1=UI, B2=Themes, B3=Something else)

问题

  • 是否有可能仍然使用来自父POM的完整构建,并仅在正确的子模块中激活相应的配置文件?(这将是我最喜欢的解决方案)
  • 还是需要使用高级反应堆选项(-pl等)进行单独的构建?
  • 或者对于这种情况是否有完全不同的方法?

编辑

由于问题被识别为重复,因此进行了编辑: 问题在于,根据相应问题提到的解决方案不起作用。

如果我使用属性激活子配置文件,那么它也将被激活模块B(父级)和所有子级。

我只想要它在子级B1B2中激活。


1
可能是从父配置文件激活子配置文件的重复。 - A_Di-Matteo
同意@A.DiMatteo的观点。链接的问题已经回答了这个问题。 - Tunaki
这个配置文件额外添加的构建内容是什么?还有一些插件执行步骤吗?你能提到涉及的插件吗?虽然有可能有解决方案,但我需要更多细节 :) - A_Di-Matteo
如果我添加所有细节,那么问题会变得非常复杂,这就是为什么我试图将其抽象化的原因。还涉及到许多其他插件执行,其中包括目标包中的不同附加内容等。 - JDC
1个回答

21

如果您想要一个配置文件被应用于子模块中(仅限某些子模块),并且该配置文件在它们的父项目(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已执行的插件(作为其默认构建和打包的一部分)的全局插件配置,则可以重新定义其执行并覆盖 默认执行ID

请注意,我们也可以使用 skip 配置元素来达到同样的效果,但是:

  • 并非所有插件都提供 skip 配置项
  • 使用 phase 元素与任何配置无关,可以重用附加到相同阶段的其他执行

我已经实现了你的解决方案,看起来它是有效的。唯一的问题是我的配置文件插件执行发生在不同的阶段。现在我需要在子POM中设置4个属性。我尝试使用Maven antrun插件在验证阶段进行此操作(子级将一个属性设置为true,antrun设置所有其他属性),但这似乎不起作用。无论如何,谢谢你,如果我找不到一次设置多个属性的解决方案,这仍然会对我们有所帮助。 - JDC
@JDC 或许 Properties Maven Plugin 可以帮助设置多个属性。 - Gerold Broser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接