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


111

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

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

现在在同一个pom.xml中,我定义了另一个配置文件,只有在该配置文件确实被激活时,该配置文件才应处于活动状态(-P secondProfile)。因此,默认行为是:firstProfile处于活动状态,secondProfile处于非活动状态。在其他情况下,除了第一个配置文件外,我还想激活第二个配置文件。现在的问题是,如果我使用“ -P secondProfile”进行操作,那么不幸的是firstProfile被停用。Maven文档指出:

...除非使用上述方法之一激活同一POM中的另一个配置文件,否则此配置文件将自动对所有版本均有效。在命令行上或通过其激活配置激活POM中的配置文件时,默认情况下所有处于活动状态的配置文件都会自动停用。...

是否有某种可能如何使firstProfile始终保持活动状态(而不必在settings.xml中声明它)?


Answers:


153

一种技巧是避免activeByDefault,而是通过缺少属性来激活配置文件,例如:

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

然后,您应该可以使用-DskipFirstProfile 或通过停用配置文件-P !firstProfile,否则配置文件将处于活动状态。

请参阅:Maven:完整的参考资料,配置文件激活-由于缺少属性而激活


在什么情况下,这比明确提及个人资料本身有帮助或更好?即,而不是传递-DmyFlag,我可以做-PmyDefaultProfile对吗?用我丢失的标志控制它有没有好处?
Chetya

1
因为该配置文件在标记存在时会自动激活。firstProfile仅当您指定-DskipFirstProfile(例如mvn verify -DskipFirstProfile)时,配置文件才被禁用。
seanf

25

我希望有这样的可能性,我常常错过了。我可以找到的唯一相关的JIRA问题是:

MNG-4917:即使配置文件将activeByDefault设置为true,该配置文件也不处于活动状态

并且已解决为Not A Problem

我已经停止使用activeByDefault,因为这种“全有或全无”的方法对我来说毫无用处。


更改此行为的唯一方法是编写您自己的替换项DefaultProfileSelector,将其注册为plexus组件@Component( role = ProfileSelector.class )并放入其中${MAVEN_HOME}/lib/ext(这样它将被选作默认配置文件选择器)。(如果您使用的是Maven 3.0.2或更早版本,则还必须先进行编辑${MAVEN_HOME}/bin/m2.conf才能lib/ext加载lib


另一种不错的选择是配置文件继承或配置文件装饰器,允许重复使用基本配置。
皇冠

@crowne肯定是的。为什么不建议将其作为功能要求?
肖恩·帕特里克·弗洛伊德

这有点相关...我喜欢做的一件事是,将所有模块默认添加到活动配置文件中,因为我认为无法从执行中删除模块。在3.2.1他们补充说这如图所示这里。万一有人跌跌撞撞地在使用我的模块,并且出于与我类似的原因而使用模块,我将保留此评论。
曼队长

9

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

只需在中列出您activeProfilessettings.xml,就像这样:

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

在其中,my-awesome-profile我有数据库URL等设置,因此它们始终适用。在这里,我激活另一个配置文件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

您可以简单地在命令行上列出要激活的所有配置文件,如下所示:

-P profile-1,profile-2

maven设计为允许自动激活多个概要文件,但是如果您使用-P覆盖它,则仅激活参数中列出的概要文件。


7
并非完全如此。手动激活配置文件-P仅禁用<activeByDefault>配置文件。除非明确停用,否则由<activeProfiles>in settings.xml或由其他任何类型的激活的配置文件将<activation>保持活动状态。
山姆·汉斯

3

配置文件是将某些订单添加到POM中的好方法。特别是如果您出于不同目的使用同一插件的多次执行。

使用文件:

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

这将永远是正确的(除非有人在Maven引导期间删除目录:)。使用Maven 3.6.0测试。

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

使用配置文件激活扩展

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


1
似乎很小的修正<file><exists>.</exists></file>
revau.lt

0

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

仅仅因为您正在使用配置文件,并不意味着您所做的一切都需要包含在配置文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.