web-dev-qa-db-fra.com

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

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 ce problème en utilisant le drapeau activeByDefault:

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

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

... Ce profil sera automatiquement actif pour toutes les constructions sauf si une autre profil dans le même POM est activé en utilisant l’un des procédés décrits précédemment méthodes. Tous les profils actifs par défaut sont automatiquement désactivé lorsqu'un profil dans le POM est activé sur la ligne de commande ou via sa configuration d'activation. ...

Existe-t-il une possibilité de garder le premierProfil toujours actif (sans le déclarer dans le fichier settings.xml)?

93
Peter

Une astuce consiste à éviter activeByDefault et à activer le profil en 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, mais sinon, le profil sera actif.

Voir: Maven: la référence complète, activation de profil - Activation par absence de propriété

132
seanf

Je souhaite qu'il y ait une telle possibilité, je l'ai souvent raté. Le seul problème de JIRA 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 en tant que Not A Problem.

J'ai arrêté d'utiliser activeByDefault, parce que cette approche "tout ou rien" l'a rendue inutile.


La seule façon de changer ce comportement est d'écrire votre propre remplacement pour DefaultProfileSelector , enregistrez-le en tant que composant plexus avec @Component( role = ProfileSelector.class ) et mettez-le dans ${MAVEN_HOME}/lib/ext (ainsi, il sera sélectionné comme sélecteur de profil par défaut). (Si vous utilisez Maven 3.0.2 ou une version antérieure, vous devrez également éditer ${MAVEN_HOME}/bin/m2.conf pour charger lib/ext avant de charger lib.)

21
Sean Patrick Floyd

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

Il suffit de lister votre activeProfiles dans votre settings.xml, comme suit:

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

Dans my-awesome-profile, j'ai des paramètres tels que les URL de base de données, etc., de sorte qu'ils toujours s'appliquent. Ici, j'active un deuxième 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)

Notez que my-awesome-profile est toujours actif. Yay!

3
inanutshellus

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

-P profil-1, profil-2

maven a été conçu pour autoriser automatiquement l'activation de plusieurs profils. Toutefois, si vous le remplacez par -P, seuls les profils répertoriés dans le paramètre sont activés.

3
Assem

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.

Utiliser des fichiers:

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

Ce sera toujours vrai (à moins que quelqu'un supprime le répertoire lors du démarrage 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 module.json présent.

Utiliser une extension d'activation de profil

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

0
Ondra Žižka

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 dans la section principale du pom.

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

0
Daniel Stolz