如何保持 Maven 配置文件是 activeByDefault 活动,即使另一个配置文件被激活?

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

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

现在,在同一个 pom.xml 中,我定义了第二个配置文件,只有当该配置文件真正被激活时,该配置文件才应该处于活动状态(- P second Profile)。 所以默认行为是: firstProfile 活动,Second Profile 非活动。 在其他一些点,我想激活除了第一个配置文件的第二个配置文件。 现在的问题是,如果我用“-P second Profile”这样做,很不幸,firstProfile 会被停用。 Maven 的文档指出:

此配置文件将自动成为 激活所有构建,除非另一个 激活同一 POM 中的配置文件 使用前面描述的 所有活动的配置文件 默认情况下是自动的 当 POM 中的配置文件失效时 在命令行上激活,或者 通过它的激活配置。 ...

是否有某种可能性使 firstProfile 始终处于活动状态(而不必在 setings.xml 中声明它) ?

54484 次浏览

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

MNG-4917: 即使将 activeByDefault 设置为 true,配置文件也不是活动的

它被解决为 Not A Problem

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


改变这种行为的唯一方法是编写自己的 DefaultProfileSelector替代品,用 @Component( role = ProfileSelector.class )将其注册为一个丛元件,并将其放入 ${MAVEN_HOME}/lib/ext(这样它将被选作默认配置文件选择器)。(如果您使用的是 Maven3.0.2或更高版本,那么在加载 lib之前还必须编辑 ${MAVEN_HOME}/bin/m2.conf来加载 lib/ext)

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

- P 轮廓-1轮廓-2轮廓

Maven 被设计成允许自动激活多个配置文件,但是如果你用-P 覆盖它,那么只有在参数中列出的配置文件被激活。

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

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

然后您应该能够使用 -DskipFirstProfile禁用配置文件 或与 -P !firstProfile,但否则配置文件将是活动的。

见: Maven: 完整的引用,配置文件激活-由于缺少一个属性而激活

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

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

这个问题是古老的,但似乎可以通过使用 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仍然处于活动状态!

配置文件是为 POM 带来一些秩序的好方法。 特别是如果你为了不同的目的使用同一个插件的多次执行。

使用文件:

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

这将永远是正确的(除非有人在 Maven 启动期间删除目录:)。

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

使用配置文件激活扩展插件

有几个用于激活配置文件的 Maven 扩展,其中一个在分叉处:
Https://github.com/ondrazizka/el-profile-activator-extension