wake-up-neo.net

Wie können aktive Maven-Profile aktiv bleiben, auch wenn ein anderes Profil aktiviert wird?

Ich habe ein Profil in meiner pom.xml, das immer aktiv sein sollte, es sei denn, es ist explizit deaktiviert (-P! FirstProfile) .. Ich habe dieses Problem mit dem Flag activeByDefault 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 dann aktiv sein sollte, wenn das Profil wirklich aktiviert ist (-P secondProfile) . Das Standardverhalten ist also: firstProfile active, secondProfile inactive ..__ Ansonsten möchte ich das zweite Profil zusätzlich zum ersten Profil aktivieren. Jetzt ist das Problem, dass das firstProfile, wenn ich das mit "-P secondProfile" mache, leider deaktiviert wird .. Die Maven-Dokumentation besagt folgendes:

... Dieses Profil wird automatisch .__ sein. Aktiv für alle Builds, sofern keine andere Profil im selben POM ist aktiviert mit einem der zuvor beschriebenen Methoden. Alle aktiven Profile standardmäßig sind automatisch deaktiviert, wenn ein Profil im POM wird in der Befehlszeile oder .__ aktiviert. durch seine Aktivierung config. ...

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

93
Peter

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

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

Sie sollten das Profil dann mit -DskipFirstProfile Oder -P !firstProfile deaktivieren können, andernfalls ist das Profil aktiv.

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

132
seanf

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

MNG-4917: Profil nicht aktiv, obwohl für activeByDefault der Wert true festgelegt ist

Und es wurde als Not A Problem aufgelöst.

Ich habe aufgehört, activeByDefault zu verwenden, weil dieser Ansatz "alles oder nichts" für mich wertlos ist.


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

21

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

Listen Sie einfach Ihre activeProfiles in Ihrem settings.xml auf, wie folgt:

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

In my-awesome-profile habe ich Einstellungen wie Datenbank-URLs und so weiter, damit 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, dass my-awesome-profile noch aktiv ist. Yay!

3
inanutshellus

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

-P Profil-1, Profil-2

maven wurde so konzipiert, dass mehrere Profile automatisch aktiviert werden können. Wenn Sie dies jedoch mit -P überschreiben, werden nur die im Parameter aufgeführten Profile aktiviert.

3
Assem

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

Dateien verwenden:

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

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

Dies könnte auch eine gute Möglichkeit sein, zwischen Projekttypen zu unterscheiden. Zum Beispiel hat mein Projekt immer module.json vorhanden.

Profilaktivierungserweiterung verwenden

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

0
Ondra Žižka

Sie können das Standardprofil nicht aktiv lassen, aber Sie können den Inhalt dieses Profils (in Ihrem Beispiel ...) übernehmen und es einfach in den Hauptbereich des POMs verschieben.

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

0
Daniel Stolz