Maven - 子模块配置文件

时间:2016-02-11 07:54:45

标签: maven pom.xml 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)

儿童 B1 B2 必须使用包含一些额外构建内容的特定配置文件构建。因此,配置文件已在模块 B 中指定。

逻辑模块属于模块 B ,并且还继承了一些依赖项等。(aggreagtion + inheritance)。
(想象一下像B = Frontend,B1 = UI,B2 =主题,B3 =其他东西)

问题

  • 是否有可能仍然使用来自父级的完整版本 pom 并仅在正确的情况下激活相应的个人资料 孩子? (将是我最喜欢的解决方案)
  • 或者我是否需要使用高级反应堆进行单独构建 选项(-pl等)?
  • 或者是否存在针对此类情况的完全其他方法?

修改

编辑,因为问题已标识为duplicate: 问题是相应问题中提到的解决方案不起作用。

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

我只希望它对孩子 B1 B2 有效。

1 个答案:

答案 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元素与任何配置无关,可以重复用于附加到同一阶段的执行