2016-02-11 33 views
5

ProblemMaven - Child modułu Profiles

Mam projektu maven, który ma podobną strukturę do następującego:
(uproszczone dla celów wyjaśnienia)

--parent 
    |-- child A (inherits from parent) 
    |-- child B (inherits from parent) 
      |-- child B1 (inherits from B) 
      |-- child B2 (inherits from B) 
      |-- child B3 (inherits from B) 

Wyłącznie dzieci muszą być zbudowane przy użyciu określonego profilu e to zawiera dodatkowe elementy. W konsekwencji profil został określony w module B.

Logicznie moduły należą do modułu B i dodatkowo dziedziczyć pewne zależności inne (aggreagtion + spadku).
(wyobrazić coś podobnego B = Frontend, B1 = UI, B2 = Themes, B3 = coś innego)


pytań

  • Czy istnieje możliwość, aby nadal korzystać a w pełni zbudować od rodzica pom i aktywować odpowiedni profil tylko we właściwych dzieciach ? (byłoby moim ulubionym rozwiązaniem)
  • Czy potrzebuję osobnych buildów przy użyciu zaawansowanych opcji reaktora (-pl, itp.)?
  • Czy istnieje zupełnie inne podejście do takich scenariuszy?

Edycja

zmiany jako kwestia zidentyfikowano jako duplicate: Problemem jest to, że rozwiązanie wymienionych w pytaniu zgodnie nie działa.

Gdybym uaktywnić sub profil za pomocą właściwości, zostanie aktywowane także dla modułu B (rodzica), a dla WSZYSTKIE dzieci.

Chcę tylko, aby był aktywny dla dziecka B1 i B2.

+1

Prawdopodobny duplikat [Aktywacja profilu podrzędnego z profilu rodzica] (http://stackoverflow.com/questions/35304770/activating-a-child- profil z profilu nadrzędnego) –

+0

Zgadzam się z @A.DiMatteo. Połączone pytanie odpowiada na to pytanie. – Tunaki

+0

Proszę zobaczyć moją edycję. – JDC

Odpowiedz

8

Jeśli chcesz mieć profil, który powinien być zastosowany do podmodułów (i tylko niektórych z nich), zdefiniowany w sposób scentralizowany w ich projekcie nadrzędnym (pom), a jednocześnie nie stosować profilu do samego rodzica, tutaj jest proponowane podejście:

Zdefiniuj profil w pom nadrzędnego, próbka jeden:

<profiles> 
    <profile> 
     <id>sample-profile</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-antrun-plugin</artifactId> 
        <version>1.5</version> 
        <executions> 
         <execution> 
          <id>print-hello</id> 
          <phase>${phase.prop}</phase> 
          <goals> 
           <goal>run</goal> 
          </goals> 
          <configuration> 
           <target> 
            <echo message="hello there!" /> 
           </target> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

Uwaga, co robimy:

  • plugin phase elementem jest para metrized, więc wiązanie wtyczki do fazy budowy również zostanie sparametryzowane.
  • Możemy teraz zdecydować za pośrednictwem właściwości, do której fazy załączamy wykonanie wtyczki.
  • Możemy teraz zdecydować za pośrednictwem właściwości, aby załączyć wykonanie tej wtyczki bez fazy (lub faza pusty)

Tak, w tym samym pom nadrzędnego, niech określić właściwość:

<properties> 
    <phase.prop>none</phase.prop> 
</properties> 

jako taka kompilacja działa na pom nadrzędnej będą przywiązywać wykonanie wtyczek do żadnego etapu (none nie jest keyworem d lub znanej wartości, po prostu standard de facto użyty dla nieistniejącej fazy, możesz zostawić ją pustą lub umieścić dowolną wartość, która by miała taki sam efekt), a zatem pomiń go. Domyślnie zostanie również pominięty we wszystkich zadeklarowanych modułach. Profil będzie nadal aktywny w każdym module, ale będzie nieszkodliwy, ponieważ domyślnie nie będzie wykonywał żadnej wtyczki.

Następnie w modułach gdzie chcesz egzekucje plugin być aktywny można ponownie zdefiniować tylko danej nieruchomości i wymagany etap:

<properties> 
    <phase.prop>package</phase.prop> 
</properties> 

Kiedy następnie aktywowanie profilu z głównego kompilacji (rodzica)

mvn clean install -Psample-profile 

rodzic będzie stosować go do wszystkich modułów, ale skuteczne wykonanie profilu nastąpi tylko wówczas, gdy wartość phase.prop ma wartość maven-sensowne.

Jeśli potrzebujesz różnych faz dla różnych implementacji wtyczek, możesz zdefiniować więcej niż jedną właściwość i zastosować ten sam wzorzec.

Jeśli nie masz wykonania wtyczki, ale raczej globalnej konfiguracji wtyczki dla wtyczki już wykonanej przez Mavena (w ramach jego pakowania i domyślnej kompilacji), możesz wtedy ponownie zdefiniować jego wykonanie, zastępując wartość default execution id.

Zauważ, że mogliśmy zrobić to samo przy użyciu elementu skip konfiguracji, ale:

  • nie wszystkie wtyczki zapewniają wejście skip konfiguracji
  • pomocą elementu phase nie jest powiązany z żadnym konfiguracji i może być ponownie użyte w przypadku egzekucji dołączonych do tej samej fazy
+0

Zaimplementowałem twoje rozwiązanie i wydaje się działać. Jedynym problemem jest to, że wykonywanie wtyczek moich profili odbywa się w różnych fazach. Teraz muszę ustawić 4 właściwości wewnątrz pom pom. Próbowałem to zrobić, używając wtyczki maven antrun w fazie sprawdzania poprawności (dziecko ustawia właściwość na true, a antrun ustawia wszystkie inne właściwości), ale to nie działa. Mimo wszystko dziękuję, jeśli nie znajdę rozwiązania pozwalającego ustawić wiele właściwości naraz, to nam to pomoże. – JDC

+0

@JDC Być może wtyczka [Properties Maven Plugin] (http://www.mojohaus.org/properties-maven-plugin/) pomaga w ustawianiu wielu właściwości. –