Salta un sottomodulo durante una build Maven


160

Abbiamo bisogno di essere in grado di saltare un sottomodulo in determinati ambienti.

Il modulo in questione contiene test di integrazione e richiede mezz'ora per l'esecuzione. Quindi vogliamo includerlo durante la compilazione sul server CI, ma quando gli sviluppatori compilano localmente (e i test vengono eseguiti), vogliamo saltare quel modulo.

C'è un modo per farlo con un'impostazione del profilo? Ho fatto un po 'di ricerche su Google e ho esaminato le altre domande / risposte qui e non ho trovato una buona soluzione.

Suppongo che un'opzione sia quella di rimuovere completamente quel sottomodulo dal genitore pom.xmle aggiungere semplicemente un altro progetto sul nostro server CI per creare quel modulo.

Suggerimenti?


Perché non Maven Way? È un'affermazione perfettamente valida per me.
MaDa,

Hmm. Ora non riesco a trovare i luoghi in cui le persone sembravano discutere contro questo ... quindi ho aggiornato la mia domanda originale per rimuovere la mia affermazione che questo non sembra essere "The Maven Way".
denishaskin,

Risposte:


149

Certo, questo può essere fatto usando i profili. Puoi fare qualcosa come il seguente nel tuo pom.xml genitore.

  ...
   <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>
 ...

Nel tuo elemento della configurazione eseguiresti Maven con il ciprofilo, ad esmvn -P ci clean install


4
Risposta eccellente! Non so perché ho avuto così tanti problemi a trovarlo dai documenti di Maven. L'unico suggerimento che vorrei dare è che, poiché preferisco che i test di integrazione vengano eseguiti per impostazione predefinita, ho aggiunto activeByDefaulta quel profilo e quindi ho dovuto aggiungere un altro profilo vuoto (ad esempio skip-integration-tests) per poterli saltare.
denishaskin,

7
c'è un modo per farlo senza duplicare tutte le cose condivise?
JonnyRaa,

7
Attenzione, se si utilizza il plugin maven-release, sembrerebbe che non aggiorni il numero di versione dei sottomoduli nascosti dietro un interruttore di profilo. Potresti avere sottomoduli con numeri di versione diversi rispetto al resto del tuo progetto ...
Ardesco,

8
Sfortunatamente, usando il profilo non è possibile escludere un modulo precedentemente menzionato nella parte principale <modules> del pom. Il JIRA issues.apache.org/jira/browse/MNG-5230 (e l'intera struttura pom) avrebbe potuto essere implementato completamente molto meglio con un pensiero un po 'più attento.
Ed Randall,

2
questa soluzione funziona davvero? Almeno non riesco a farlo funzionare. Sembra che io abbia lo stesso problema di @EdRandall
Gerros,

232

La versione 3.2.1 di Maven ha aggiunto questa funzione, è possibile utilizzare l' -plopzione ( collegamento per l' --projectselenco) con !o -( sorgente ) per escludere determinati sottomoduli.

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

Fai attenzione a colpire il personaggio! è un personaggio speciale, quindi o devi citare un singolo (come ho fatto io) o sfuggirlo con il carattere barra rovesciata.

La sintassi per escludere più moduli è la stessa dell'inclusione

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

EDIT Windows non sembra gradire le virgolette singole, ma è necessario in bash; in Windows, usa virgolette doppie (grazie @awilkinson)

mvn -pl "!submodule1,!submodule2" install

27
Importante: se si desidera escludere un sottomodulo nidificato, è necessario utilizzare la versione qualificatamvn -pl !com.acme:nestedmodule1
Leonard Brünings,

3
L'opzione -pl richiede '[groupId]:' prima di artefattoId, quindi dovremmo usare mvn -pl '!: Submodule-to-exclude' install
Honsen

4
Puoi anche usare mvn -pl '!path/to/submodule/directory', senza usare groupId e artefactId. La mia risposta funziona se submodule1e submodule2si trova nella directory corrente.
Alexandre DuBreuil,

E 'anche da notare che se si utilizza -plin mvn install, è probabile che tu bisogno di usarlo per mvn deploycosì
majikman

39

È possibile decidere quali progetti di reattore costruire compilando l' -plargomento della riga di comando:

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

Accetta un elenco di parametri separato da virgole in una delle seguenti forme:

  • percorso relativo della cartella contenente il POM
  • [groupId]:artifactId

Pertanto, data la seguente struttura:

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

È possibile specificare la seguente riga di comando:

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

per costruire tutto. Rimuovi gli elementi nell'elenco per creare solo i moduli che ti piacciono.


EDIT: come ha sottolineato Blackbuild , a partire da Maven 3.2.1 hai una nuova -elbandiera che esclude i progetti dal reattore, in modo simile a ciò -plche:


2
Grazie. Questo ha funzionato bene per me. Si noti inoltre che è possibile aggiungere "-am" (AKA "- anche-make") per creare anche progetti richiesti dai moduli specificati.
GaZ

1
Grande! Ho usato mvn install -pl .per installare il genitore solo nel repository locale senza creare moduli.
Marcin,

Inoltre, dai un'occhiata a jira.codehaus.org/browse/MNG-5230 . Ora puoi escludere progetti dal reattore.
Blackbuild,

1
MNG-5230 link dalla chiusura di codehaus.org: issues.apache.org/jira/browse/MNG-5230
Ed Randall

Sfortunatamente, non funziona in modo transitorio, cioè se ho top / mod1 / mod2 e costruisco dall'alto, -pl '! Mod2' genera un errore.
zakmck,

4

La nozione di progetti multi-modulo è lì per soddisfare le esigenze di segmenti codipendenti di un progetto. Tale client dipende dai servizi che a loro volta dipendono da EJB o routine di accesso ai dati. È possibile raggruppare i test di integrazione continua (CI) in questo modo. Lo razionalizzerei dicendo che i test CI devono essere in fase di blocco con le modifiche della logica dell'applicazione.

Supponiamo che il tuo progetto sia strutturato come:

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

I project-root/pom.xmlmoduli definisce

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

I ci/pom.xmlprofili definisce quali:

... 
<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>

Ciò comporterà i test di salto di Maven in questo modulo tranne quando il profilo denominato CIè attivo. Il server CI deve essere istruito per l'esecuzione mvn clean package -P CI. Il sito web Maven ha una spiegazione approfondita del meccanismo di profilazione .


2

ora c'è (dalla versione 1.1.1) un flag 'skip' in pit.

Quindi puoi fare cose come:

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

nel tuo modulo, e la buca salterà

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @ module-selenium --- [INFO] Progetto di salto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.