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

问题描述 投票:0回答:7

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

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

现在在同一个 pom.xml 中,我定义了第二个配置文件,只有当配置文件真正激活时(-P secondaryProfile),它才应该处于活动状态。 因此默认行为是:firstProfile 处于活动状态,secondProfile 处于非活动状态。 在其他时候,除了第一个配置文件之外,我还想激活第二个配置文件。 现在的问题是,如果我使用“-P secondaryProfile”执行此操作,则 firstProfile 不幸会被停用。 Maven 文档指出了这一点:

... 该配置文件将自动 对所有构建都有效,除非另一个 激活同一个 POM 中的配置文件 使用前面描述的一种 方法。所有处于活动状态的配置文件 默认情况下会自动 当 POM 中的配置文件被停用时 在命令行上激活或 通过其激活配置。 ...

是否有可能以某种方式保持第一个配置文件始终处于活动状态(无需在settings.xml中声明它)?

maven-2 maven maven-3
7个回答
178
投票

一个技巧是避免

activeByDefault
,而是通过缺少属性来激活配置文件,例如:

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

然后您应该能够使用

-DskipFirstProfile
停用配置文件 或使用
-P !firstProfile
,但否则配置文件将处于活动状态。

参见:Maven:完整参考,配置文件激活 - 通过缺少属性进行激活


30
投票

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

MNG-4917:配置文件未激活,即使其 activeByDefault 设置为 true

已解决为

Not A Problem

我已经停止使用

activeByDefault
,因为这种“全有或全无”的方法让它对我来说毫无价值。


更改此行为的唯一方法是编写自己的

DefaultProfileSelector
替代品,使用
@Component( role = ProfileSelector.class )
将其注册为丛组件并将其放入
${MAVEN_HOME}/lib/ext
中(这样它将被选为默认配置文件选择器) 。 (如果您使用的是 Maven 3.0.2 或更早版本,您还必须在加载
${MAVEN_HOME}/bin/m2.conf
之前编辑
lib/ext
来加载
lib


12
投票

这个问题很古老,但看起来这个问题可以通过使用

activeProfile
而不是
activeByDefault
来解决。我使用的是 Maven 3.3.9,但该解决方案可能适用于早期版本。

只需在您的

activeProfiles
中列出您的
settings.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
仍然处于活动状态。耶!


8
投票

配置文件是将一些秩序带入 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


4
投票

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

-P 轮廓-1,轮廓-2

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


0
投票

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

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


0
投票

这是我针对

activeByDefault
的解决方法,它因设计而被破坏,请参阅 MNG-4917。感谢 Sean Patrick Floyd 在他的回答中提供了该问题的链接。

<activation>
  <jdk>[1.)</jdk>
</activation>
© www.soinside.com 2019 - 2024. All rights reserved.