Jak zachować aktywne profile Mavena, które są aktywneByDefault, nawet jeśli zostanie aktywowany inny profil?

113

Mam profil w moim pom.xml, który powinien być zawsze aktywny, chyba że zostanie wyraźnie dezaktywowany (-P! FirstProfile). Rozwiązałem to za pomocą flagi activeByDefault:

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

Teraz w tym samym pom.xml mam zdefiniowany drugi profil, który powinien być aktywny tylko wtedy, gdy profil jest naprawdę aktywowany (-P secondProfile). Więc domyślne zachowanie to: firstProfile aktywny, secondProfile nieaktywny. W innym miejscu chciałbym aktywować drugi profil oprócz pierwszego profilu. Teraz problem polega na tym, że jeśli zrobię to z "-P secondProfile", to firstProfile zostanie niestety dezaktywowane. Dokumentacja Mavena stwierdza, że:

... Ten profil będzie automatycznie aktywny dla wszystkich kompilacji, chyba że inny profil w tym samym POM zostanie aktywowany jedną z wcześniej opisanych metod. Wszystkie profile, które są domyślnie aktywne, są automatycznie dezaktywowane, gdy profil w POM jest aktywowany w linii poleceń lub poprzez jego konfigurację aktywacji. ...

Czy jest jakaś możliwość, aby pierwszy profil był zawsze aktywny (bez konieczności deklarowania go w settings.xml)?

Piotr
źródło

Odpowiedzi:

153

Jedną sztuczką jest unikanie activeByDefaulti zamiast tego aktywowanie profilu przez brak właściwości, np .:

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

Powinieneś wtedy móc dezaktywować profil za pomocą -DskipFirstProfile lub za pomocą -P !firstProfile, ale w przeciwnym razie profil będzie aktywny.

Zobacz: Maven: The Complete Reference, Profile Activation - Activation by the Brak Property

seanf
źródło
W jakich okolicznościach jest to pomocne lub lepsze niż wyraźne wspominanie o samym profilu? tj. zamiast przekazywania w -DmyFlag mogę zrobić -PmyDefaultProfile w prawo? Czy jest jakaś korzyść z kontrolowania go flagą, której mi brakuje?
Chetya
1
Ponieważ profil jest aktywny automatycznie, gdy nie ma flagi . Profil firstProfilejest wyłączony tylko wtedy, gdy określisz -DskipFirstProfile(np mvn verify -DskipFirstProfile.).
seanf
25

Żałuję, że nie było takiej możliwości, często mi ją brakowało. Jedyny istotny problem dotyczący JIRA, jaki udało mi się znaleźć, to ten:

MNG-4917: Profil nie jest aktywny, mimo że ma ustawioną wartość activeByDefault

I został rozwiązany jako Not A Problem.

Przestałem używać activeByDefault, ponieważ podejście typu „wszystko albo nic” sprawiło, że było to dla mnie bezwartościowe.


Jedynym sposobem zmiany tego zachowania jest napisanie własnego zamiennika DefaultProfileSelector, zarejestrowanie go jako komponentu splotu @Component( role = ProfileSelector.class )i umieszczenie go w nim ${MAVEN_HOME}/lib/ext(w ten sposób zostanie wybrany jako domyślny selektor profilu). (Jeśli używasz Maven 3.0.2 lub starszego, będziesz musiał również edytować, ${MAVEN_HOME}/bin/m2.confaby załadować, lib/extzanim się załaduje lib)

Sean Patrick Floyd
źródło
Alternatywą, którą można mieć, byłoby dziedziczenie profili lub dekoratory profili, umożliwiające ponowne wykorzystanie konfiguracji podstawowych.
crowne
@crowne zdecydowanie, tak. Dlaczego nie zasugerować tego jako prośby o funkcję?
Sean Patrick Floyd
To jest trochę powiązane ... Jedną rzeczą, którą lubię robić, jest dodanie wszystkich modułów do aktywnego profilu domyślnego, ponieważ myślałem, że nie ma sposobu, aby usunąć moduł z wykonania. W 3.2.1 dodali to, jak pokazano tutaj . Zostawiam ten komentarz na wypadek, gdyby ktoś się tutaj potknął i używa modułów z podobnego powodu co ja.
Captain Man
10

To pytanie jest starożytne, ale wydaje się, że problem można rozwiązać za pomocą activeProfilezamiast activeByDefault. Jestem na Maven 3.3.9, ale rozwiązanie może działać na wcześniejszych wersjach.

Po prostu wpisz swoje activeProfilesw swoim settings.xml, na przykład:

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

W my-awesome-profilemam ustawienia, takie jak adresy URL baz danych i tak dalej, więc zawsze mają zastosowanie. Tutaj aktywuję drugi 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)

Zwróć uwagę, jak my-awesome-profilejest nadal aktywny. Yay!

inanutshellus
źródło
4

Możesz po prostu wyświetlić wszystkie profile, które chcesz aktywować w wierszu poleceń, takie jak:

-P profil-1, profil-2

maven został zaprojektowany tak, aby umożliwić automatyczną aktywację wielu profili, jeśli jednak zastąpisz to opcją -P, aktywowane zostaną tylko profile wymienione w parametrze.

Assem
źródło
7
To nie do końca prawda. Ręczna aktywacja profili -Ptylko z dezaktywacją <activeByDefault>profili. Profile aktywowane przez <activeProfiles>in settings.xmllub przez jakikolwiek inny typ <activation>pozostają aktywne, chyba że zostaną wyraźnie dezaktywowane.
Sam Hanes,
4

Profile to dobry sposób na uporządkowanie POM. Zwłaszcza jeśli używasz wielu wykonań tej samej wtyczki do różnych celów.

Korzystanie z plików:

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

Tak będzie zawsze (chyba że ktoś usunie katalog podczas rozruchu Mavena :). Testowane z Maven 3.6.0.

Może to być również dobry sposób na rozróżnienie typów projektów. Na przykład mój projekt był zawsze module.jsonobecny.

Korzystanie z rozszerzenia aktywującego profil

Istnieje kilka rozszerzeń Maven do aktywacji profilu. Jeden z nich w widelcu tutaj:
https://github.com/OndraZizka/el-profile-activator-extension

Ondra Žižka
źródło
1
mała korekta wydaje się być<file><exists>.</exists></file>
revau.lt
-1

Nie możesz zachować aktywnego profilu domyślnego, ale możesz wziąć zawartość tego profilu (w Twoim przykładzie) i po prostu przenieść go do głównej sekcji pliku pom.

Tylko dlatego, że używasz profili, nie oznacza, że ​​wszystko, co robisz, musi znajdować się w profilu.

Daniel Stolz
źródło
Nie daje to odpowiedzi na pytanie - OP wyraźnie stwierdza, że ​​profil powinien być „zawsze aktywny, chyba że zostanie wyraźnie dezaktywowany”. Można przypuszczać, że czasami trzeba go wyraźnie wyłączyć, na co ta odpowiedź nie pozwala.
sleske