如何保持即使另一个configuration文件被激活activeByDefault活动的Mavenconfiguration文件?

我在我的pom.xml中有一个configuration文件,除非明确禁用(-P!firstProfile),否则应始终保持活动状态。 我通过使用activeByDefault标志解决了这个问题:

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

现在在同一个pom.xml文件中,我定义了第二个configuration文件,只有当configuration文件真正被激活时(-P secondProfile),才能激活它。 所以默认行为是:firstProfile active,secondProfile不活动。 在另外一点上,我想激活除了第一个configuration文件之外的第二个configuration文件。 现在的问题是,如果我这样做“-P secondProfile”第一个configuration文件不幸被取消激活。 Maven文档指出:

…除非同一POM中的另一个configuration文件使用前述方法之一激活,否则此configuration文件将自动激活所有构build。 所有在默认情况下处于激活状态的configuration文件在命令行中激活了POM中的configuration文件或通过其激活configuration时会自动停用。 …

有没有办法保持firstProfile始终处于活动状态(不必在settings.xml中声明)?

一个窍门是避免activeByDefault ,而不是激活configuration文件缺乏一个属性,例如:

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

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

请参阅: Maven:完整引用,configuration文件激活 – 由缺less属性激活

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

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

它已被解决为Not A Problem

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


改变这种行为的唯一方法是编写你自己的替代品DefaultProfileSelector ,注册为@Component( role = ProfileSelector.class )的plexus组件,并将其放在${MAVEN_HOME}/lib/ext (这样就可以选为默认configuration文件select器)。 (如果您使用的是Maven 3.0.2或${MAVEN_HOME}/bin/m2.conf在加载lib/ext之前,还必须编辑${MAVEN_HOME}/bin/m2.conf以加载lib/ext

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

-Pconfiguration文件-1,configuration文件-2

maven被devise为允许自动激活多个configuration文件,但是如果您使用-P覆盖,那么只激活参数中列出的configuration文件。

这个问题是古老的,但似乎可以通过使用activeByDefault而不是activeByDefault来解决问题。 我在Maven 3.3.9,但解决scheme可能在早期版本。

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

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

my-awesome-profile我有像数据库URL等设置,所以他们总是适用。 在这里,我激活第二个configuration文件, 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仍然活跃。 好极了!

你不能保持默认的configuration文件处于活动状态,但是你可以获取configuration文件的内容(在你的例子中),并把它移动到pom的主要部分。

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

  • Gradle:使第三方jar可用于本地gradle存储库
  • maven:如何通过命令行选项跳过某些项目的testing?
  • Maven:如何覆盖库添加的依赖项
  • 你知道的所有Maven Archetype目录的URL是什么?
  • 如何用Maven包装Ant构build?
  • 我如何告诉jaxb / Maven生成多个模式包?
  • Maven:在classes文件夹中包含一个META-INF文件夹
  • maven:是否可以通过使用命令行选项或envvariables覆盖本地存储库的位置?
  • JAVA_HOME受到Maven的影响
  • JDK tools.jar作为maven的依赖
  • Maven依赖项上的NoClassDefFoundError