Wie kann man Maven-Profile, die activeByDefault sind, auch dann aktiv halten, wenn ein anderes Profil aktiviert wird?

111

Ich habe ein Profil in meiner pom.xml, das immer aktiv sein sollte, es sei denn, es ist explizit deaktiviert (-P! FirstProfile). Ich habe dies mithilfe des ActiveByDefault-Flags gelöst:

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

Jetzt habe ich in derselben pom.xml ein zweites Profil definiert, das nur aktiv sein sollte, wenn das Profil wirklich aktiviert ist (-P secondProfile). Das Standardverhalten lautet also: firstProfile active, secondProfile inactive. An einer anderen Stelle möchte ich das zweite Profil zusätzlich zum ersten Profil aktivieren. Das Problem ist nun, dass wenn ich das mit "-P secondProfile" mache, das firstProfile leider deaktiviert wird. In der Maven-Dokumentation heißt es:

... Dieses Profil ist automatisch für alle Builds aktiv, es sei denn, ein anderes Profil im selben POM wird mit einer der zuvor beschriebenen Methoden aktiviert. Alle Profile, die standardmäßig aktiv sind, werden automatisch deaktiviert, wenn ein Profil im POM in der Befehlszeile oder über seine Aktivierungskonfiguration aktiviert wird. ...

Gibt es eine Möglichkeit, das firstProfile immer aktiv zu halten (ohne es in der settings.xml deklarieren zu müssen)?

Peter
quelle

Antworten:

153

Ein Trick besteht darin activeByDefault, das Profil durch das Fehlen einer Eigenschaft zu vermeiden und stattdessen zu aktivieren, z.

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

Sie sollten dann in der Lage sein, das Profil mit -DskipFirstProfile oder mit zu deaktivieren -P !firstProfile, andernfalls ist das Profil aktiv.

Siehe: Maven: Die vollständige Referenz, Profilaktivierung - Aktivierung durch das Fehlen einer Eigenschaft

Seanf
quelle
Unter welchen Umständen ist dies hilfreich oder besser, als das Profil selbst explizit zu erwähnen? dh anstatt -DmyFlag zu übergeben, kann ich -PmyDefaultProfile richtig machen? Hat es einen Vorteil, es mit einem Flag zu steuern, das mir fehlt?
Chetya
1
Weil das Profil automatisch aktiv ist, wenn das Flag nicht vorhanden ist. Das Profil firstProfileist nur deaktiviert, wenn Sie angeben -DskipFirstProfile(z mvn verify -DskipFirstProfile. B. ).
Seanf
25

Ich wünschte, es gäbe eine solche Möglichkeit, ich habe sie oft verpasst. Das einzige relevante JIRA-Problem, das ich finden konnte, ist das folgende:

MNG-4917: Profil nicht aktiv, obwohl activeByDefault auf true gesetzt ist

Und es wurde gelöst als Not A Problem.

Ich habe aufgehört zu verwenden activeByDefault, weil dieser "Alles oder Nichts" -Ansatz es für mich wertlos machte.


Die einzige Möglichkeit, dieses Verhalten zu ändern, besteht darin, einen eigenen Ersatz für zu schreiben DefaultProfileSelector, ihn als Plexuskomponente bei zu registrieren @Component( role = ProfileSelector.class )und einzufügen ${MAVEN_HOME}/lib/ext(auf diese Weise wird er als Standardprofilauswahl ausgewählt). (Wenn Sie Maven 3.0.2 oder älter verwenden, müssen Sie vor ${MAVEN_HOME}/bin/m2.confdem Laden auch bearbeiten , um lib/extes zu laden. lib)

Sean Patrick Floyd
quelle
Eine Alternative wäre die Profilvererbung oder die Profildekoration, mit der Basiskonfigurationen wiederverwendet werden können.
Crowne
@ Crowne auf jeden Fall, ja. Warum nicht als Feature-Anfrage vorschlagen?
Sean Patrick Floyd
Das ist irgendwie verwandt ... Eine Sache, die ich gerne mache, ist das Hinzufügen aller Module zu einem aktiven Standardprofil, weil ich dachte, es gäbe keine Möglichkeit, ein Modul aus der Ausführung zu entfernen. In 3.2.1 haben sie dies wie hier gezeigt hinzugefügt . Ich hinterlasse diesen Kommentar für den Fall, dass jemand hier stolpert und Module aus einem ähnlichen Grund wie ich verwendet.
Captain Man
9

Diese Frage ist uralt, aber es scheint, dass das Problem activeProfileeher durch Verwendung als durch gelöst werden kann activeByDefault. Ich bin auf Maven 3.3.9, aber die Lösung funktioniert möglicherweise auf früheren Versionen.

Listen Sie einfach Ihre activeProfilesin Ihrem settings.xml, wie folgt:

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

In habe my-awesome-profileich Einstellungen wie Datenbank-URLs und so weiter, so dass sie immer gelten. Hier aktiviere ich ein zweites 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)

Beachten Sie, wie my-awesome-profilenoch aktiv ist. Yay!

inanutshellus
quelle
4

Sie können einfach alle Profile, die Sie aktivieren möchten, in der Befehlszeile als solche auflisten:

-P Profil-1, Profil-2

maven wurde entwickelt, um die automatische Aktivierung mehrerer Profile zu ermöglichen. Wenn Sie dies jedoch mit -P überschreiben, werden nur die im Parameter aufgeführten Profile aktiviert.

Assem
quelle
7
Das stimmt nicht ganz. Manuelles Aktivieren von Profilen mit -Pnur deaktivierten <activeByDefault>Profilen. Profile, die von <activeProfiles>in settings.xmloder von einem anderen Typ aktiviert wurden, <activation>bleiben aktiv, sofern sie nicht ausdrücklich deaktiviert werden.
Sam Hanes
3

Profile sind ein guter Weg, um Ordnung in POM zu bringen. Insbesondere, wenn Sie mehrere Ausführungen desselben Plugins für unterschiedliche Zwecke verwenden.

Verwenden von Dateien:

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

Dies ist immer der Fall (es sei denn, jemand löscht das Verzeichnis während des Maven-Starts :). Getestet mit Maven 3.6.0.

Dies kann auch eine gute Möglichkeit sein, zwischen Projekttypen zu unterscheiden. Zum Beispiel war mein Projekt immer module.jsonpräsent.

Verwenden einer Profilaktivierungserweiterung

Es gibt einige Maven-Erweiterungen für die Profilaktivierung. Eine davon in einer Gabelung hier:
https://github.com/OndraZizka/el-profile-activator-extension

Ondra Žižka
quelle
1
kleine Korrektur scheint es zu sein<file><exists>.</exists></file>
revau.lt
0

Sie können das Standardprofil nicht aktiv halten, aber Sie können den Inhalt dieses Profils (das ... in Ihrem Beispiel) nehmen und es einfach in den Hauptabschnitt des POM verschieben.

Nur weil Sie Profile verwenden, bedeutet dies nicht, dass sich alles, was Sie tun, in einem Profil befinden muss.

Daniel Stolz
quelle