【问题标题】:Maven - Child Module ProfilesMaven - 子模块配置文件
【发布时间】:2016-05-21 21:27:33
【问题描述】:

问题

我有一个 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)

只有子 B1B2 必须使用包含一些额外构建内容的特定配置文件来构建。因此,配置文件已在模块 B 中指定。

逻辑上模块属于模块 B 并且另外继承一些依赖项等(聚合 + 继承)。
(想象一下 B = Frontend , B1 = UI, B2 = 主题, B3 = 其他)


问题

  • 是否有可能仍然使用父级的完整版本 pom 并仅在正确的情况下激活相应的配置文件 孩子们? (将是我最喜欢的解决方案)
  • 或者我是否需要使用高级反应堆进行单独构建 选项(-pl 等)?
  • 或者对于这种情况有完全其他的方法吗?

编辑

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

如果我使用属性激活子配置文件,它也会为 模块 B(父级)和 ALL 子级激活。

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

【问题讨论】:

  • 同意@A.DiMatteo。链接的问题回答了这个问题。
  • 配置文件添加的这些额外构建内容是什么?更多的插件执行?您至少可以提及涉及的插件吗?有一个可能的解决方案,但我需要更多细节:)
  • 如果我添加所有细节,它会爆炸这个问题,这就是我试图抽象它的原因。还有很多其他插件执行,包括目标包中的不同附加内容等。

标签: maven pom.xml multi-module maven-profiles


【解决方案1】:

如果您想拥有一个应该应用于子模块(并且只有其中一些)的配置文件,在其父项目 (pom) 中以集中方式定义,但不将该配置文件应用于父项目本身,请点击此处是一种建议的方法:

在父pom中定义profile,示例一:

<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-meaningful 值时才会执行有效的配置文件。

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

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

请注意,我们可以使用 skip 配置元素来做同样的事情,但是:

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

【讨论】:

  • 我实施了您的解决方案,它似乎有效。唯一的问题是我的配置文件插件执行发生在不同的阶段。现在我需要在子 pom.xml 中设置 4 个属性。我尝试在验证阶段使用 maven antrun 插件来执行此操作(child 将属性设置为 true 并且 antrun 设置所有其他属性),但这似乎不起作用。无论如何,谢谢你,如果我找不到一次设置多个属性的解决方案,这仍然会帮助我们。
  • @JDC 也许Properties Maven Plugin 有助于设置多个属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多