27

设想:

  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激活父母和孩子的个人资料

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

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

4

3 回答 3

10

为了扩展@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自动激活配置文件。如果默认情况下未激活,您可以使用基于文件的激活来使此模块针对 1.1 构建newest,但是暂时针对 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浮现在脑海中。

于 2012-08-29T15:27:09.867 回答
7

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

于 2009-10-06T17:33:35.930 回答
6

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

除非您能够从命令行传递属性,在您的 settings.xml 中指定配置文件激活(通常不是一个好主意),或者使用我之前的解决方法,否则您对这种方法有点困惑回答使用标记文件的存在。

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

您可以使用字符“!”停用配置文件 或 '-' 像这样:

mvn install -P !profile-1,!profile-2
于 2009-10-01T18:34:08.200 回答