Pomiń moduł podrzędny podczas kompilacji Mavena

160

W niektórych środowiskach musimy mieć możliwość pominięcia modułu podrzędnego.

Przedmiotowy moduł zawiera testy integracyjne i trwa pół godziny. Dlatego chcemy uwzględnić go podczas budowania na serwerze CI, ale gdy programiści budują lokalnie (a testy są uruchamiane), chcemy pominąć ten moduł.

Czy można to zrobić za pomocą ustawienia profilu? Zrobiłem trochę google i spojrzałem na inne pytania / odpowiedzi tutaj i nie znalazłem dobrego rozwiązania.

Przypuszczam, że jedną z opcji jest pom.xmlcałkowite usunięcie tego modułu podrzędnego z modułu nadrzędnego i po prostu dodanie innego projektu na naszym serwerze CI, aby po prostu zbudować ten moduł.

Propozycje?

denishaskin
źródło
Dlaczego nie Maven Way? To całkowicie uzasadnione roszczenie do mnie.
MaDa
Hmm. Teraz nie mogę znaleźć miejsc, w których ludzie zdawali się argumentować przeciwko temu ... więc zaktualizowałem moje pierwotne pytanie, aby usunąć moje twierdzenie, że nie wygląda to na „Droga Maven”.
denishaskin

Odpowiedzi:

149

Oczywiście, można to zrobić za pomocą profili. Możesz zrobić coś podobnego do poniższego w swoim nadrzędnym pom.xml.

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

W swoim CI uruchomiłbyś maven z ciprofilem, tjmvn -P ci clean install

Raghuram
źródło
4
Doskonała odpowiedź! Nie wiem, dlaczego miałem tyle problemów ze znalezieniem tego z doktorów Mavena. Jedyną sugestią, jaką mógłbym zrobić, jest to, że ponieważ wolę, aby testy integracji były uruchamiane domyślnie, dodałem activeByDefaultdo tego profilu, a następnie musiałem dodać kolejny pusty profil (np. skip-integration-tests), Aby móc je pominąć.
denishaskin
7
czy można to zrobić bez duplikowania wszystkich udostępnionych rzeczy?
JonnyRaa
7
Uwaga, jeśli używasz wtyczki maven-release-plugin, wydaje się, że nie aktualizuje ona numeru wersji modułów podrzędnych, które są ukryte za przełącznikiem profilu. Możesz mieć podmoduły z innymi numerami wersji niż reszta projektu ...
Ardesco
8
Niestety z profilu nie można wykluczyć modułu wspomnianego wcześniej w głównej części <modules> pliku pom. JIRA Issues.apache.org/jira/browse/MNG-5230 (i cała struktura pom) mogła zostać w pełni zaimplementowana o wiele lepiej przy nieco dokładniejszym przemyśleniu.
Ed Randall,
2
czy to rozwiązanie naprawdę działa? Przynajmniej nie mogę zmusić go do pracy. Wygląda na to, że mam ten sam problem, co @EdRandall
Gerros
231

Maven w wersji 3.2.1 dodał tę funkcję, możesz użyć -plprzełącznika ( skrótu do --projectslisty) z !lub -( źródło ), aby wykluczyć niektóre podmoduły.

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

Uważaj w walce z postacią! jest znakiem specjalnym, więc musisz go zacytować pojedynczo (tak jak ja) lub uciec od znaku odwrotnego ukośnika.

Składnia wykluczania wielu modułów jest taka sama jak w przypadku włączenia

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

EDYCJA Windows nie lubi pojedynczych cudzysłowów, ale jest to konieczne w bash; w systemie Windows użyj podwójnych cudzysłowów (dzięki @awilkinson)

mvn -pl "!submodule1,!submodule2" install
Alexandre DuBreuil
źródło
27
Ważne: jeśli chcesz wykluczyć zagnieżdżony mvn -pl !com.acme:nestedmodule1
moduł podrzędny
3
Opcja -pl wymaga '[groupId]:' przed artifactId, więc powinniśmy użyć mvn -pl '!: Submodule-to-exclude' install
Honsen
4
Możesz również użyć mvn -pl '!path/to/submodule/directory', bez używania groupId i artifactId. Moja odpowiedź działa, jeśli submodule1i submodule2znajdują się w bieżącym katalogu.
Alexandre DuBreuil
Warto też nic, że w przypadku korzystania -plz mvn install, prawdopodobnie będziesz musiał użyć go mvn deployjako dobrze
majikman
39

Można zdecydować, które projekty reaktora zbudować, podając -plargument wiersza poleceń:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

Przyjmuje listę parametrów oddzielonych przecinkami w jednej z następujących form:

  • względna ścieżka do folderu zawierającego POM
  • [groupId]:artifactId

Zatem biorąc pod uwagę następującą strukturę:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

Możesz określić następujący wiersz poleceń:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

zbudować wszystko. Usuń elementy z listy, aby zbudować tylko te moduły, które Ci odpowiadają.


EDYCJA: jak wskazał blackbuild , od Maven 3.2.1 masz nową -elflagę, która wyklucza projekty z reaktora, podobnie do tego, co -plrobi:

skuro
źródło
2
Dzięki. To działało dobrze dla mnie. Zauważ również, że możesz dodać "-am" (AKA "--also-make"), aby także budować projekty, które są wymagane przez określone moduły.
GaZ
1
Wspaniały! Użyłem mvn install -pl ., aby zainstalować pom-matkę tylko w lokalnym repozytorium bez modułów budowlanych.
Marcin
Zajrzyj również na jira.codehaus.org/browse/MNG-5230 . Możesz teraz wykluczyć projekty z reaktora.
czarna budowla
1
Link do MNG-5230 od czasu zamknięcia codehaus.org: Issues.apache.org/jira/browse/MNG-5230
Ed Randall
Niestety nie działa to przechodnie, tj. Jeśli mam top / mod1 / mod2 i buduję od góry, -pl '! Mod2' wywołuje błąd.
zakmck
4

Pojęcie projektów wielomodułowych ma na celu zaspokojenie potrzeb współzależnych segmentów projektu. Taki klient jest zależny od usług, które z kolei zależą od, powiedzmy, EJB lub procedur dostępu do danych. W ten sposób można pogrupować testy ciągłej integracji (CI). Zracjonalizowałbym to, mówiąc, że testy CI muszą być na bieżąco ze zmianami logiki aplikacji.

Załóżmy, że struktura Twojego projektu jest następująca:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

Te project-root/pom.xmlmoduły Definiuje

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

Te ci/pom.xmlprofile definiuje takie jak:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

Spowoduje to, że Maven pominie testy w tym module, z wyjątkiem sytuacji, gdy nazwany profil CIjest aktywny. Twój serwer CI musi mieć polecenie wykonania mvn clean package -P CI. Witryna internetowa Maven zawiera szczegółowe wyjaśnienie mechanizmu profilowania .

Sri Sankaran
źródło
2

jest teraz (od wersji 1.1.1) flaga 'pomiń' w pit.

Możesz więc robić takie rzeczy, jak:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

w twoim module, a pit przeskoczy

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @ module-selenium --- [INFO] Pomijanie projektu

twillouer
źródło