2011-11-29 4 views
99

Abbiamo la necessità di poter saltare un sottomodulo in determinati ambienti.Salta un sottomodulo durante una build Maven

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

C'è un modo per farlo con un'impostazione del profilo? Ho fatto qualche ricerca 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 il sottomodulo dal genitore pom.xml e di aggiungere un altro progetto sul nostro server CI solo per creare quel modulo.

Suggerimenti?

+0

Perché non Maven Way? È un reclamo perfettamente valido per me. – MaDa

+0

Hmm. Ora non riesco a trovare i posti in cui la gente sembrava discutere contro questo ... quindi ho aggiornato la mia domanda iniziale per rimuovere la mia affermazione che questo non sembra essere "The Maven Way". – denishaskin

risposta

113

Certo, questo può essere fatto usando i profili. Puoi fare qualcosa di simile al seguente nel tuo padre 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> 
... 

Nella tua CI, si dovrebbe eseguire Maven con il profilo ci, vale a diremvn -P ci clean install

+2

Ooh! Quello è buono. Più semplice del mio suggerimento. –

+3

Ottima risposta! Non so perché ho avuto così tanti problemi a scoprire questo dai documenti Maven. L'unico suggerimento che vorrei fare è che, poiché preferisco che i test di integrazione siano eseguiti di default, ho aggiunto 'activeByDefault' a quel profilo, e poi ho dovuto aggiungere un altro profilo vuoto (ad es.'skip-integration-tests') per poterli saltare. – denishaskin

+5

c'è un modo per farlo senza duplicare tutte le cose condivise? –

5

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 dire EJB o routine di accesso ai dati. È possibile raggruppare i test di integrazione continua (CI) in questo modo. Razionalizzerei ciò dicendo che i test CI devono essere in lock-step con le modifiche alla logica dell'applicazione.

supponga che il progetto è strutturata come:

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

Il project-root/pom.xml definisce moduli

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

Il ci/pom.xml definisce profili 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à Maven saltando prove in questo modulo tranne quando il profilo n amed CI è attivo. Il server CI deve essere istruito per eseguire mvn clean package -P CI. Il sito Web Maven ha un in-depth explanation of the profiling mechanism.

32

È possibile decidere quali progetti reattore costruire specificando l'argomento della riga -pl comando:

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

Esso accetta un elenco separato dei parametri in una delle seguenti forme:

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

Così, 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 

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


EDIT: come blackbuild rilevare, come di Maven 3.2.1 avete a new -el flag che esclude i progetti dal reattore, analogamente a quanto fa -pl:

+1

Grazie. Questo ha funzionato bene per me. Si noti inoltre che è possibile aggiungere "-am" (AKA "--also-make") anche per creare 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

+0

Inoltre, dai un'occhiata a https://jira.codehaus.org/browse/MNG-5230. Ora puoi escludere i progetti dal reattore. – blackbuild

111

versione Maven 3.2.1 aggiunto questa funzione, è può usare l'opzione -pl con "!" per escludere alcuni sottomoduli.

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

Attenzione nel carattere! è un personaggio speciale, quindi è necessario quotarlo singolarmente (come ho fatto io) o sfuggire al carattere backslash.

La sintassi di escludere modulo multipla è la stessa della inclusione

mvn -pl '!submodule1,!submodule2' install 

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

mvn -pl "!submodule1,!submodule2" install 
+9

Importante: se si desidera escludere un sottomodulo nidificato è necessario utilizzare la versione qualificata 'mvn -pl ! com.acme: nestedmodule1' –

2

c'è ora (da 1.1.1 versione) un 'saltare' la bandiera in pit.

modo da poter fare le 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 vostro modulo e pit salterete

[INFO] --- pitest-Maven: 1.1.3: mutationCoverage (default-CLI) @ modulo-selenio --- [INFO] Saltare il progetto