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

Posted

技术标签:

【中文标题】即使另一个配置文件被激活,如何保持 activeByDefault 的 Maven 配置文件处于活动状态?【英文标题】:How to keep Maven profiles which are activeByDefault active even if another profile gets activated? 【发布时间】:2011-07-15 15:04:01 【问题描述】:

我的 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 中声明)?

【问题讨论】:

另见Does using activeByDefault go against maven best practices? 【参考方案1】:

一个技巧是避免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

【讨论】:

在什么情况下这比明确提及个人资料本身更有帮助或更好?即不是传入 -DmyFlag 我可以做 -PmyDefaultProfile 对吗?用我缺少的标志来控制它有什么好处吗? 因为当标志在那里时,配置文件会自动激活。仅当您指定 -DskipFirstProfile(例如 mvn verify -DskipFirstProfile)时,配置文件 firstProfile 才会被禁用。【参考方案2】:

我希望有这样的可能性,我经常错过它。我能找到的唯一相关 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

【讨论】:

另一种不错的选择是配置文件继承或配置文件装饰器,允许重复使用基本配置。 @crown 当然,是的。为什么不建议将其作为功能请求? 这有点相关......我喜欢做的一件事是将所有模块添加到默认情况下处于活动状态的配置文件中,因为我认为没有办法从执行中删除模块。在 3.2.1 中,他们添加了这个,如图所示 here。如果有人在这里绊倒并出于与我类似的原因使用模块,我将留下此评论。【参考方案3】:

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

只需在您的settings.xml 中列出您的activeProfiles,如下所示:

<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 仍然处于活动状态。耶!

【讨论】:

在其他开发人员现在将获得不同构建行为的工作环境中,这不是一个好的解决方案,因为他们的 settings.xml 可能不包含此设置。 我相信你很困惑,@GeertSchuring。这工作环境中的一个很好的解决方案,因为您正在更改您的个人settings.xml 文件而不是共享的pom.xml OP 要求提供不涉及 settings.xml 的解决方案... 如果您无法使用其他解决方案更改您的 pom.xml 并且无法更改您的个人 settings.xml 文件,那么我怀疑您陷入了“金锤”的境地,需要重新评估你想要做什么。【参考方案4】:

配置文件是一种为 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

【讨论】:

小修正好像是&lt;file&gt;&lt;exists&gt;.&lt;/exists&gt;&lt;/file&gt;【参考方案5】:

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

-P profile-1,profile-2

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

【讨论】:

这并不完全正确。使用-P 手动激活配置文件只会停用&lt;activeByDefault&gt; 配置文件。由settings.xml 中的&lt;activeProfiles&gt; 或任何其他类型的&lt;activation&gt; 激活的配置文件保持活动状态,除非明确停用。【参考方案6】:

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

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

【讨论】:

这不能回答问题 - OP 明确指出配置文件应该“始终处于活动状态,除非它被明确停用”。大概有时需要明确禁用它,这个答案不允许。

以上是关于即使另一个配置文件被激活,如何保持 activeByDefault 的 Maven 配置文件处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

在所有内容之上显示一个 UIAlertController 并保持在顶部,即使推送另一个视图(iOS 13)

即使焦点在另一个控件上,如何更改列表视图选定的行背景颜色?

即使水平滚动,如何使放置在fabricjs对象顶部的DOM元素保持在那里

如何在Linux中增加SSH连接超时的时间

即使视图被移除也保持约束

使用文件存在忽略我的 Maven 配置文件中的激活(始终执行配置文件)