Maven - 子模块配置文件

JDC*_*JDC 7 pom.xml maven multi-module maven-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)
Run Code Online (Sandbox Code Playgroud)

仅仅孩子B1B2必须使用包含一些额外构建内容的特定配置文件构建.结果,配置文件已在模块B中指定.

逻辑上,模块属于模块B,并且还继承了一些依赖项等(aggreagtion + inheritance).
(想象一下像B = Frontend,B1 = UI,B2 = Themes,B3 = Something)


  • 是否有可能仍然使用父pom完整版本并仅在正确的孩子中激活相应的配置文件?(将是我最喜欢的解决方案)
  • 或者我是否需要使用高级反应器选项(-pl等)进行单独构建?
  • 或者是否存在针对此类场景的完全其他方法?

编辑

编辑,因为问题被确定为重复:问题是相应问题中提到的解决方案不起作用.

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

我只希望它对孩子B1B2有效.

A_D*_*teo 14

如果你想要一个应该应用于子模块的配置文件(并且只有一些模块),在它们的父项目(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>
Run Code Online (Sandbox Code Playgroud)

注意我们在做什么:

  • 插件phase元素是参数化的,因此插件与构建阶段的绑定也将进行参数化
  • 我们现在可以决定通过属性将这个插件执行到哪个阶段
  • 我们现在可以决定通过属性将此插件执行附加到无阶段(或空阶段)

所以,在同一个父pom中,让我们定义属性:

<properties>
    <phase.prop>none</phase.prop>
</properties>
Run Code Online (Sandbox Code Playgroud)

因此,在父pom上运行的构建会将插件执行附加到无阶段(none不是关键字或已知值,只是用于非现有阶段的事实标准,您可以将其留空或放任何你喜欢的价值,它会有相同的效果),因此跳过它.在所有声明的模块中,默认情况下也会跳过它.该配置文件仍将在每个模块中处于活动状态,但由于默认情况下不会执行任何插件,因此无害.

然后,在您希望插件执行处于活动状态的模块中,您可以仅重新定义相关属性和所需阶段:

<properties>
    <phase.prop>package</phase.prop>
</properties>
Run Code Online (Sandbox Code Playgroud)

然后从主构建(父级)激活配置文件

mvn clean install -Psample-profile
Run Code Online (Sandbox Code Playgroud)

父级将其应用于所有模块,但有效的配置文件执行仅在phase.prop值具有maven有意义的值时发生.

如果您需要为不同的插件执行设置不同的阶段,那么您可以定义多个属性并应用相同的模式.

如果您没有插件执行,而是已经由Maven执行的插件的全局插件配置(作为其打包和默认构建的一部分),则可以重新定义其执行,覆盖默认执行ID.

请注意,我们可以使用skip配置元素完成相同的操作,但是:

  • 并非所有插件都提供skip配置条目
  • 使用该phase元素与任何配置无关,可以重复用于连接到同一阶段的执行