即使另一个配置文件被激活,如何保持activeByDefault的Maven配置文件处于活动状态?

时间:2011-03-15 08:51:45

标签: maven-2 maven maven-3

我的pom.xml中有一个配置文件,除非明确停用(-P!firstProfile),否则它应始终处于活动状态。 我通过使用activeByDefault标志解决了这个问题:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    ...
  </profile>
</profiles>

现在在同一个pom.xml中我定义了第二个配置文件,只有在配置文件被激活时才应该激活(-P secondProfile)。 因此默认行为是:firstProfile active,secondProfile inactive。 在其他一些方面,除了第一个配置文件之外,我还想激活第二个配置文件。 现在的问题是,如果我用“-P secondProfile”执行此操作,则不幸的是,firstProfile会被停用。 Maven文档说明了这一点:

  

...   此个人资料将自动生效   所有版本都有效,除非另一个   激活同一POM中的配置文件   使用前面描述的一个   方法。所有活动的配置文件   默认情况下是自动的   在POM中的配置文件时停用   在命令行上激活或   通过其激活配置。   ...

是否有可能如何保持firstProfile始终处于活动状态(无需在settings.xml中声明它)?

6 个答案:

答案 0 :(得分:135)

一个诀窍是避免activeByDefault,而是通过缺少属性激活配置文件,例如:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <property>
        <name>!skipFirstProfile</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>

然后您应该可以使用-DskipFirstProfile停用个人资料 或者使用-P !firstProfile,否则个人资料将处于有效状态。

请参阅:Maven: The Complete Reference, Profile Activation - Activation by the Absence of a Property

答案 1 :(得分:21)

我希望有这种可能性,我经常错过它。我能找到的唯一相关的JIRA问题就是这个问题:

  

MNG-4917: Profile not active even though it has activeByDefault set to true

它已被解决为Not A Problem

我已经停止使用activeByDefault,因为这种“全有或全无”的做法使我对它毫无价值。


更改此行为的唯一方法是为DefaultProfileSelector编写您自己的替代品,将其注册为带有@Component( role = ProfileSelector.class )的plexus组件并将其放入${MAVEN_HOME}/lib/ext(这样就可以了选为默认配置文件选择器)。 (如果您使用的是Maven 3.0.2或更早版本,则还必须在加载${MAVEN_HOME}/bin/m2.conf之前编辑lib/ext以加载lib

答案 2 :(得分:3)

您只需在命令行中列出要激活的所有配置文件:

-P profile-1,profile-2

maven旨在允许自动激活多个配置文件,如果您使用-P覆盖它,则只激活参数中列出的配置文件。

答案 3 :(得分:3)

这个问题很古老,但使用activeProfile而非activeByDefault似乎可以解决问题。我在使用Maven 3.3.9,但该解决方案可能适用于早期版本。

只需在activeProfiles中列出settings.xml,就像这样:

<settings>
  <profiles>
    [...]
  </profiles>
  <activeProfiles>
    <activeProfile>my-awesome-profile</activeProfile>
  </activeProfiles>
</settings>

my-awesome-profile我有数据库网址等设置,因此总是适用。在这里,我激活了第二个个人资料resolve-from-central

$ mvn help:all-profiles -P resolve-from-central 
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-help-plugin:2.2:all-profiles (default-cli) @ standalone-pom ---
[INFO] Listing Profiles for Project: org.apache.maven:standalone-pom:pom:1
  Profile Id: resolve-from-central (Active: true , Source: settings.xml)
  Profile Id: my-awesome-profile (Active: true , Source: settings.xml)
  Profile Id: resolve-from-internal (Active: false , Source: settings.xml)

注意my-awesome-profile仍处于活动状态。耶!

答案 4 :(得分:0)

您无法保持默认配置文件处于活动状态,但您可以获取该配置文件的内容(在您的示例中为...),然后将其移至pom的主要部分。

仅仅因为您使用的是个人资料,并不意味着您所做的一切都需要在个人资料中。

答案 5 :(得分:0)

配置文件是将某些订单带入POM的好方法。 尤其是如果您出于不同目的使用同一插件的多次执行。

使用文件:

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><present>.</present></file>
    </activation>
    ...
</profile>

这将始终为真(除非有人在Maven引导期间删除目录:)。在Maven 3.6.0上进行了测试。

这也是区分项目类型的好方法。例如,我的项目始终module.json存在。

使用个人资料激活扩展程序

有一些用于配置文件激活的Maven扩展。其中一个叉在这里:
https://github.com/OndraZizka/el-profile-activator-extension