我的 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 中声明)?
一个技巧是避免 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
我希望有这样的可能性,我经常错过它。我能找到的唯一相关的 JIRA 问题是这个:
MNG-4917:配置文件未激活,即使它已将 activeByDefault 设置为 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
)
这个问题很古老,但似乎可以通过使用 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
文件而不是共享的 pom.xml
。
配置文件是给 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
<file><exists>.</exists></file>
您可以简单地列出要在命令行上激活的所有配置文件,如下所示:
-P profile-1,profile-2
maven 旨在允许自动激活多个配置文件,但是如果您使用 -P 覆盖它,则仅激活参数中列出的配置文件。
-P
手动激活配置文件只会停用 <activeByDefault>
配置文件。由 settings.xml
中的 <activeProfiles>
或任何其他类型的 <activation>
激活的配置文件保持活动状态,除非明确停用。
您不能保持默认配置文件处于活动状态,但您可以获取该配置文件的内容(在您的示例中为 ...)并将其移动到 pom.xml 的主要部分。
仅仅因为您正在使用配置文件,并不意味着您所做的一切都需要在配置文件中。
-DskipFirstProfile
(例如mvn verify -DskipFirstProfile
)时,配置文件firstProfile
才会被禁用。