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

Pet*_*ter 102 maven-2 maven-3 maven

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

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    ...
  </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

现在在同一个pom.xml中我定义了第二个配置文件,只有在配置文件被激活时才会激活(-P secondProfile).因此默认行为是:firstProfile active,secondProfile inactive.在其他一些方面,除了第一个配置文件之外,我还想激活第二个配置文件.现在的问题是,如果我用"-P secondProfile"执行此操作,则不幸的是,第一个配置文件将被停用.Maven文档说明了这一点:

...除非使用前面描述的方法之一激活同一POM中的另一个配置文件,否则此配置文件将自动为所有版本激活.当在命令行上激活POM中的配置文件或通过其激活配置时,默认情况下处于活动状态的所有配置文件都将自动停用....

是否有可能如何保持firstProfile始终处于活动状态(无需在settings.xml中声明它)?

sea*_*anf 144

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

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <property>
        <name>!skipFirstProfile</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

然后,您应该能够使用-DskipFirstProfile 或禁用配置文件-P !firstProfile,否则配置文件将处于活动状态.

请参阅:Maven:完整参考,配置文件激活 - 由于缺少属性而激活

  • 因为当标志不在那里时,配置文件会自动激活。配置文件“firstProfile”仅在您指定“-DskipFirstProfile”(例如“mvn verify -DskipFirstProfile”)时才被禁用。 (2认同)

Sea*_*oyd 24

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

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

它已被解决为Not A Problem.

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


更改此行为的唯一方法是编写自己的替换DefaultProfileSelector,将其注册为plexus组件@Component( role = ProfileSelector.class )并将其放入${MAVEN_HOME}/lib/ext(这样它将被选为默认配置文件选择器).(如果您使用的是Maven 3.0.2或更早版本,则还必须${MAVEN_HOME}/bin/m2.conf在加载lib/ext前进行编辑以加载lib)


ina*_*lus 8

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

只需在中列出您activeProfilessettings.xml,就像这样:

<settings>
  <profiles>
    [...]
  </profiles>
  <activeProfiles>
    <activeProfile>my-awesome-profile</activeProfile>
  </activeProfiles>
</settings>
Run Code Online (Sandbox Code Playgroud)

在其中,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)
Run Code Online (Sandbox Code Playgroud)

注意如何my-awesome-profile仍处于活动状态。好极了!

  • 在工作环境中,这不是一个好的解决方案,因为其他开发人员现在将获得不同的构建行为,因为他们的 settings.xml 可能不包含此设置。 (2认同)
  • OP 随意要求一个不涉及 settings.xml 的解决方案... (2认同)

Ond*_*žka 6

配置文件是将某些顺序带入 POM 的好方法。特别是如果您出于不同目的使用同一插件的多次执行。

使用文件:

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><exists>.</exists></file>
    </activation>
    ...
</profile>
Run Code Online (Sandbox Code Playgroud)

这将始终是正确的(除非有人在 Maven 启动期间删除了该目录:)。使用 Maven 3.6.0 测试。

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

使用配置文件激活扩展

有一些 Maven 扩展可用于配置文件激活。其中一个在这里分叉:https :
//github.com/OndraZizka/el-profile-activator-extension