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

时间:2009-10-01 16:02:25

标签: maven-2 profile activation

情景:

  1. 鉴于
    1. 父POM,用于定义配置文件和子项(作为模块)
    2. 将通过引用父POM使用配置文件的子项目。
  2. 目的是跳过父级中的配置文件执行并仅在子级中执行
  3. 个人资料包含激活部分<activation><property><name>foo</name></property><activation>
  4. 由于父级未定义foo属性 - 该配置文件处于非活动状态且不会为父版本执行
  5. 现在,我在孩子中定义<properties><foo>true</foo></properties>,希望在执行子构建时激活属性并激活配置文件。没有这样的运气。配置文件永远不会被激活,这告诉我永远不会设置属性。
  6. 请注意:mvn package -Dfoo=true会激活父母和子女的个人资料
  7. 我是在尝试做不可能的事情还是只是做错了?

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

3 个答案:

答案 0 :(得分:8)

为了扩展@ 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而言暂时运行它并不容易:据我所知older如果您通过newest,则-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+Activatorshttps://github.com/maoo/maven-tiles

答案 1 :(得分:5)

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

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

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

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

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

答案 2 :(得分:5)

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