Maven - 根据属性激活子配置文件

Posted

技术标签:

【中文标题】Maven - 根据属性激活子配置文件【英文标题】:Maven - activate child profile based on property 【发布时间】:2010-12-03 01:19:03 【问题描述】:

场景:

    鉴于
      定义配置文件和子项(作为模块)的父 POM 将通过引用父 POM 来使用配置文件的子项目。
    目的是跳过父级中的配置文件执行并仅在子级中执行它 个人资料有激活部分<activation><property><name>foo</name></property><activation> 由于父级未定义 foo 属性 - 配置文件处于非活动状态,不会为父级构建执行 现在,我在子级中定义<properties><foo>true</foo></properties>,希望在执行子级构建并激活配置文件时获取该属性。没有这样的运气。配置文件从未激活,这告诉我该属性从未设置。 请注意:mvn package -Dfoo=true 激活父母和孩子的个人资料

我是在尝试做不可能的事情还是只是做错了?

附:嗯 - 即使我在父级中定义属性,配置文件也不会被触发。什么给了?

【问题讨论】:

【参考方案1】:

为了扩展@rich-seller 的答案和@Bostone 的自我回答,似乎不可能有一个设置,其中父 POM 定义一些配置文件作为替代品,而子 POM 默认选择这些配置文件之一,同时允许您临时覆盖孩子的选择(即在 CLI 上)。考虑使用某些框架和关联插件的项目的父 POM,我们可以假设它们的两个版本都由属性定义:

<profiles>
  <profile>
    <id>newest</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <framework.version>2.0</framework.version>
      <plugin.version>2.0</plugin.version>
    </properties>
  </profile>
  <profile>
    <id>older</id>
    <activation>
      <property>
        <name>older.framework</name>
        <value>true</value>
      </property>
    </activation>
    <properties>
      <framework.version>1.1</framework.version>
      <plugin.version>1.1</plugin.version>
    </properties>
  </profile>
</profiles>

现在,默认情况下从这个父 POM 继承的子代将使用 2.0,正如您所期望的那样,-Polder-Dolder.framework=true 将尝试使用旧框架构建它(例如,测试兼容性)。但是您不能在子 POM 中写入

<properties>
  <older.framework>true</older.framework>
</properties>

并自动激活older 配置文件。如果默认情况下newest 未处于活动状态,您可以使用基于文件的激活来使该模块针对 1.1 构建,但是暂时针对 2.0 运行它并不容易:据我所知 oldernewest如果您通过-Pnewest,配置文件将处于活动状态,因此您需要明确禁用其他配置文件,如果您有十几个配置文件,这是不合理的。因此,除了将配置文件信息复制到子 POM 之外,没有其他解决方案:

<properties>
  <framework.version>1.1</framework.version>
  <plugin.version>1.1</plugin.version>
</properties>

此时-Pnewest 无法覆盖这些属性,因此您需要使用-Dframework.version=2.0 -Dplugin.version=2.0

换句话说,配置文件只有在默认情况下所有子模块都可以使用相同的配置文件(此处为newest)时才有用。如果其中一些通常是用 1.1 构建的,而另一些是用 2.0 构建的,那么配置文件就没有用了。

似乎这是 Maven 核心增强的用例,或者可能是 Maven 3 构建扩展。 http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activators 和 https://github.com/maoo/maven-tiles 浮现在脑海中。

【讨论】:

是的。我接受这个,因为它建立在我的答案之上,我通常不喜欢接受我自己的 非常有用的信息。感谢您提供有关基于文件的激活的提示;这非常干净地解决了我的问题。【参考方案2】:

直接回答我自己的问题:在多模块构建中,所有属性都是在构建运行之前设置的,因此不可能在其中一个模块中激活/停用配置文件 em> 基于在子 POM 中设置属性的构建。但是,如果您正在寻找使用其他方式的方法,请read this comment

【讨论】:

【参考方案3】:

只能通过从命令行传递的属性激活配置文件。这是因为 POM 中的属性只有在 POM 被解析后才能被处理,此时解决配置文件激活为时已晚。

除非您能够从命令行传递属性,在 settings.xml 中指定配置文件激活(通常不是一个好主意),或者使用解决方法在我的previous answer 中使用标记文件的存在。

如果您使用的是 Maven 2.1.0+,最后一种选择是仅通过命令行为父 POM停用配置文件,这显然仍然不理想。

您可以使用字符“!”停用个人资料或像这样的“-”:

mvn install -P !profile-1,!profile-2

【讨论】:

我很害怕。实际上,配置文件的执行似乎已设置,并且在构建开始后无法更改(即使使用标记文件)。停用这些 -1 和 -2 指的是什么?如果我有父母和孩子以及个人资料“构建”,以下是否会假设取消父母的个人资料? (在我的测试中不是)mvn install -P !buiild-1 我不太明白。为什么&lt;missing&gt;&lt;exists&gt; 配置文件触发器对您不起作用? 示例是停用两个名为profile-1profile-2的配置文件,-1-2没有特殊意义。在你的情况下,它只是mvn install -P !build 但这会停用整个配置文件,并且不会在父级或子级上执行?还是我错过了什么? 您只会将参数传递给父项目的构建,因此在安装/部署父项目时配置文件不会处于活动状态。然而,配置文件将在已安装的 pom 中,因此当构建一个孩子时,配置文件将被继承并处于活动状态(假设您没有使用参数显式停用它)

以上是关于Maven - 根据属性激活子配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Maven:配置文件激活取决于 localRepository 属性?

如何在子模块中停用 Maven 配置文件?

Maven:如果配置文件 B 未激活,则仅激活配置文件 A?

除了默认配置文件外,Maven 配置文件未激活

为啥我不能从另一个配置文件激活 Maven2 配置文件?

多个条件下的 Maven 配置文件激活