2016-02-10 36 views
7

Mam następujący nadrzędnego pom.xml plik:Aktywacja profilu Dziecko z profilu dominującej

<profile> 
    <id>build_full</id> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
    <modules> 
     <module>mymodule_interface</module> 
     <module>mymodule_switch</module> 
     <module>mymodule_switch_simulator</module> 
     <module>mymodule_switch_controller</module> 
     <module>mymodule_server</module> 
    </modules> 
</profile> 

iw moim pom dziecięcej dla mymodule_server, mam następujący:

<profile> 
    <id>subprofile</id> 
    <modules> 
     <module>...various modules...</module> 
    </modules> 
</profile> 
<profile> 
    <id>default</id> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
    <modules> 
     <module>...various modules...</module> 
    </modules> 
</profile> 

Jak, kiedy invoke maven: mvn -P build_full, czy mogę wymusić moduł podrzędny (mymodule_server), aby użyć profilu subprofile zamiast default?

Odpowiedz

4

Nie, nie można aktywować profilu podrzędnego z profilu nadrzędnego. Bardziej ogólnie, you can't activate or deactivate any profile from any other profile (istnieje zapytanie o funkcję JIRA MNG-3309). Co możesz zrobić to activate two profiles based on the same property.

Po pierwsze, używanie profilu aktywowanego domyślnie nie jest dobrym pomysłem. To, czego chcesz, to aktywować profil na podstawie pewnych warunków (wersja OS, właściwość systemu ...). Aby rozwiązać problem, możesz aktywować profil build_full, gdy obecna jest określona właściwość systemowa, i upewnić się, że subprofile jest również aktywowany, gdy ta sama właściwość jest obecna.

Przykładowa konfiguracja byłaby następująca, gdy oba profile są aktywowane, gdy właściwość systemowa fullBuild jest ustawiona na true. Wywołanie Maven z mvn -DfullBuild=true ... aktywuje oba profile.

<profile> 
    <id>build_full</id> 
    <activation> 
     <property> 
      <name>fullBuild</name> 
      <value>true</value> 
     </property> 
    </activation> 
    <modules> 
     <module>mymodule_interface</module> 
     <module>mymodule_switch</module> 
     <module>mymodule_switch_simulator</module> 
     <module>mymodule_switch_controller</module> 
     <module>mymodule_server</module> 
    </modules> 
</profile> 
<profile> 
    <id>subprofile</id> 
    <activation> 
     <property> 
      <name>fullBuild</name> 
      <value>true</value> 
     </property> 
    </activation> 
    <modules> 
     <module>...various modules...</module> 
    </modules> 
</profile> 
+0

Właśnie lokalnie testowane przed wysłaniem moją odpowiedź, prawdopodobnie popełnił błąd, będzie re-test to wtedy –

+0

@ A.DiMatteo ten powinien pracować podczas jazdy z rodzicem POM. Twoje rozwiązanie powinno również działać, ale nie znalazłem wszystkich parametrów '-P' (myślę, że to zbyt kruche) – Tunaki

+1

Potwierdzam, że oba rozwiązania działają dobrze. Rzeczywiście twoja propozycja jest mniej szczegółowa z linii poleceń i lepiej centralizuje aktywację w jednym miejscu. –

2

W twoim przypadku, od górnej folderze rodzic/agregatora, można po prostu uruchomić:

mvn clean install -Pbuild_full,!default,subprofile 

To spowoduje wyłączenie dowolnego profilu mający nazwę default (a zatem wyłączyć profil w danym podmodułem) i włącz dowolny profil o nazwie subprofile (i tym samym włącz profil, który chciałeś).

Alternatywnie, można skonfigurować subprofile jako takie:

<profiles> 
    <profile> 
     <id>subprofile</id> 
     <activation> 
      <property> 
       <name>subprofile</name> 
       <value>true</value> 
      </property> 
     </activation> 
     .... 

a następnie uruchomić w następujący sposób:

mvn clean install -Dsubprofile=true -Pbuild_full 

będzie mieć taki sam skutek. Możesz nawet ominąć element value i po prostu określić -Dsubprofile, jego istnienie wystarczyłoby do aktywacji profilu (w takim przypadku sugerowana jest bardziej znacząca nazwa, na przykład -DactivateSubprofile). Ponieważ aktywujesz inny profil, automatycznie Maven dezaktywuje domyślny.