Comment garder les profils Maven qui sont actifsByDefault actifs même si un autre profil est activé?

113

J'ai un profil dans mon pom.xml qui devrait être toujours actif à moins qu'il ne soit explicitement désactivé (-P! FirstProfile). J'ai résolu cela en utilisant l'indicateur activeByDefault:

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

Maintenant, dans le même pom.xml, j'ai un deuxième profil défini, cela ne devrait être actif que si le profil est vraiment activé (-P secondProfile). Le comportement par défaut est donc: firstProfile actif, secondProfile inactif. À un autre moment, j'aimerais activer le deuxième profil en plus du premier profil. Maintenant, le problème est que si je fais cela avec "-P secondProfile" le firstProfile est malheureusement désactivé. La documentation Maven indique ceci:

... Ce profil sera automatiquement actif pour toutes les versions à moins qu'un autre profil du même POM ne soit activé en utilisant l'une des méthodes décrites précédemment. Tous les profils actifs par défaut sont automatiquement désactivés lorsqu'un profil dans le POM est activé sur la ligne de commande ou via sa configuration d'activation. ...

Existe-t-il en quelque sorte une possibilité de garder le firstProfile toujours actif (sans avoir à le déclarer dans le settings.xml)?

Peter
la source

Réponses:

153

Une astuce consiste à éviter activeByDefaultet à activer le profil par l'absence de propriété, par exemple:

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

Vous devriez alors pouvoir désactiver le profil avec -DskipFirstProfile ou avec -P !firstProfile, sinon le profil sera actif.

Voir: Maven: The Complete Reference, Profile Activation - Activation by the Absence of a Property

seanf
la source
Dans quelles circonstances est-ce utile ou mieux que de mentionner explicitement le profil lui-même? c'est-à-dire au lieu de passer dans -DmyFlag je peux faire -PmyDefaultProfile correctement? Y a-t-il un avantage à le contrôler avec un drapeau qui me manque?
Chetya le
1
Parce que le profil est actif automatiquement lorsque le drapeau n'est pas là. Le profil firstProfileest désactivé uniquement si vous spécifiez -DskipFirstProfile(par exemple mvn verify -DskipFirstProfile).
seanf
25

J'aurais aimé qu'il y ait une telle possibilité, je l'ai souvent ratée. Le seul problème JIRA pertinent que j'ai pu trouver est celui-ci:

MNG-4917: le profil n'est pas actif même si activeByDefault est défini sur true

Et cela a été résolu comme Not A Problem .

J'ai arrêté d'utiliser activeByDefault, parce que cette approche «tout ou rien» la rendait sans valeur pour moi.


La seule façon de changer ce comportement est d'écrire votre propre remplacement pour DefaultProfileSelector, de l'enregistrer en tant que composant plexus avec @Component( role = ProfileSelector.class )et de le mettre ${MAVEN_HOME}/lib/ext(de cette façon, il sera choisi comme sélecteur de profil par défaut). (Si vous utilisez Maven 3.0.2 ou une version antérieure, vous devrez également modifier ${MAVEN_HOME}/bin/m2.confpour le charger lib/extavant de le charger lib)

Sean Patrick Floyd
la source
Une alternative intéressante serait l'héritage de profil ou les décorateurs de profil, permettant la réutilisation des configurations de base.
crowne
@crowne définitivement, oui. Pourquoi ne pas suggérer cela comme une demande de fonctionnalité?
Sean Patrick Floyd
C'est en quelque sorte lié ... Une chose que j'aime faire ajouter tous les modules à un profil actif par défaut parce que je pensais qu'il n'y avait aucun moyen de supprimer un module de l'exécution. En 3.2.1, ils ont ajouté ceci comme indiqué ici . Je laisse ce commentaire au cas où quelqu'un trébucherait ici et utiliserait des modules pour une raison similaire à moi.
Captain Man
10

Cette question est ancienne, mais il semble que le problème puisse être résolu en utilisant activeProfileplutôt queactiveByDefault . Je suis sur Maven 3.3.9, mais la solution peut fonctionner sur des versions antérieures.

Énumérez simplement votre activeProfilesdans votre settings.xml, comme ceci:

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

Dans my-awesome-profilej'ai des paramètres tels que les URL de base de données, etc., ils s'appliquent donc toujours . Ici, activer un second profil, 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)

Remarquez comment my-awesome-profileest toujours actif. Yay!

inanutshellus
la source
4

Vous pouvez simplement lister tous les profils que vous souhaitez activer sur la ligne de commande en tant que tels:

-P profil-1, profil-2

maven a été conçu pour permettre l'activation automatique de plusieurs profils, si toutefois vous remplacez cela avec le -P, seuls les profils répertoriés dans le paramètre sont activés.

Assem
la source
7
Ce n'est pas tout à fait vrai. L'activation manuelle des profils avec -Puniquement des <activeByDefault>profils de désactivation . Les profils activés par <activeProfiles>dans settings.xmlou par tout autre type de <activation>restent actifs sauf s'ils sont explicitement désactivés.
Sam Hanes
4

Les profils sont un bon moyen de mettre de l'ordre dans POM. Surtout si vous utilisez plusieurs exécutions du même plugin à des fins différentes.

Utilisation de fichiers:

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

Ce sera toujours vrai (sauf si quelqu'un supprime le répertoire lors du démarrage de Maven :). Testé avec Maven 3.6.0.

Cela pourrait également être un bon moyen de différencier les types de projets. Par exemple, mon projet a toujours été module.jsonprésent.

Utilisation d'une extension d'activation de profil

Il existe quelques extensions Maven pour l'activation de profil. L'un d'eux dans une fourchette ici:
https://github.com/OndraZizka/el-profile-activator-extension

Ondra Žižka
la source
1
petite correction il semble être<file><exists>.</exists></file>
revau.lt
-1

Vous ne pouvez pas garder le profil par défaut actif, mais vous pouvez prendre le contenu de ce profil (le ... dans votre exemple) et le déplacer simplement vers la section principale du pom.

Ce n'est pas parce que vous utilisez des profils que tout ce que vous faites doit être inclus dans un profil.

Daniel Stolz
la source
Cela ne répond pas à la question - OP indique explicitement que le profil doit être "toujours actif à moins qu'il ne soit explicitement désactivé". Vraisemblablement, il est parfois nécessaire de le désactiver explicitement, ce que cette réponse ne permet pas.
sleske