Domanda

Lo so che è mauvais ton chiedere due volte in un solo giorno, ma ecco un altro rompicapo Maven:

Ho una POM genitore che definisce 5 moduli (5 Sottoprogetti). Dal momento che ogni modulo viene eseguita esattamente nello stesso modo in cui io tiro sezione <profile><build> in POM genitore per sbarazzarsi del codice duplicato. Ora - se eseguo costruire individualmente da ciascun modulo funziona, se voglio costruire tutti i moduli in una sola volta e passare alla directory padre ho ottenuto l'errore dal momento che la prima cosa Maven cerca di eseguire il progetto principale in sé:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

Dopo di che compilazione fallisce perché plug-exec cerca di eseguire qualcosa che non c'è. Guardando l'uscita è abbastanza evidente che plug-reattore sta guidando l'accumulo, ma come posso configurare reattore di saltare il genitore?

P.S. Per evitare confusione - Sto cercando di sopprimere l'esecuzione profilo sul genitore e attivarlo sul bambino durante la compilazione same

È stato utile?

Soluzione

Cosa c'è di sbagliato con la costruzione del genitore?

Infatti, in Maven, ci sono due concetti diversi (generalmente utilizzati allo stesso tempo):

  • Il genitore POM
  • I moduli di aggregazione

La prima è una definizione di tutto ciò che è comune con tutti i bambini. Si definisce un genitore come un progetto pom-confezionati, ed è possibile installarlo nel vostro repository.

Quando si crea un figlio di questo genitore, Maven2 recupererà questo genitore per unire il pom pom genitore con il bambino. Si può avere uno sguardo a tutta la pom.xml eseguendo il comando mvn help:effective-pom.

In questo caso, il pom genitore non verrà costruito, sarà solo essere recuperate dal repository.

Il secondo caso è un progetto che contiene un elenco modules dei sotto-progetti. Il principio è che ogni comando che si esegue su questo progetto sarà anche essere eseguito su tutti i sotto-moduli. L'ordine dei moduli sarà definito dal reattore, che esaminerà le inter-dipendenze moduli per trovare quale modulo deve essere costruito prima degli altri. Se non ci sono dipendenze, quindi ci vorrà l'elenco dei moduli così come sono definiti nella pom.xml genitore.

In questo caso, se si esegue un comando sul progetto principale, Maven2 in primo luogo costruito il progetto principale, e poi le sotto-moduli. È non possono saltare la creazione del progetto principale.


Modifica, grazie al commento RichSeller

Una spiegazione completa delle differenze tra multi-moduli (progetto di aggregazione) e l'ereditarietà (progetto principale) si possono trovare nel libro Maven, qui .

Altri suggerimenti

Non è possibile saltare la generazione del padre, ma è possibile configurare il profilo non da attivare con un piccolo hack. Questa risposta mostra come controllare l'attivazione di un profilo la presenza o l'assenza di un elemento <activation> basato su file. In questo modo si può definire il profilo del genitore, ma averlo disattivato in quel progetto a causa del file marcatore essere presenti nel genitore. progetti figlio non avrebbero il file marcatore nella loro fonte, in modo che il profilo sarebbe attivato per quei progetti.

Aggiornamento per chiarire: Sul mio progetto di test significa che questa configurazione il profilo viene disattivata nel progetto principale (che ha il file in src / main / risorse), ma attivata in tutti i progetti figlio che non hanno il file in loro risorse le directory.

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

Voglio documentare che non c'è compromesso parziale mia situazione (grazie a ragazzi sulla utenti Maven lista per il suggerimento mailing). Fondamentalmente è necessario tagliare profilo in due pezzi. sezione configuration riutilizzabile di plug-in va al POM genitore, e executions rimane nel bambino POM. Poi il plugin profilo nel bambino è contrassegnato come inherited e voilà - in fase di esecuzione profilo genitore non viene eseguito dal momento che è la sezione executions mancante. Questo è ben lungi dall'essere ideale, ma funziona. Fare riferimento a questo link , ad esempio

Non ero in grado di attuare "mancante" soluzione file come previsto da Rick Venditore sopra. Sembra che una volta impostato stato attivo / non-attivo del profilo non verrà modificato anche il file marcatore non è presente il modulo (s). Tuttavia ecco la soluzione esatta al mio problema. Attenzione: questo è disponibile solo a partire con Maven 2.1 +

Se ho un POM genitore con 2 moduli definiti: foo e poi boo in circostanze normali ordine di esecuzione sarà:

  1. genitori
  2. foo
  3. boo

Tutto quello che devi fare per saltare generazione del padre è di aggiungere questa opzione di riga di comando

mvn install –rf foo

In alternativa è possibile utilizzare --resume-from cosa che farà è di saltare genitore e continuare dal modulo foo verso il basso. Ora - Sto indagando se questo può essere realizzato mediante la configurazione plug-Reactor (P.S -. No, non può) , ma anche con l'interruttore, lo scenario di cui sopra funziona bene per me

Questo è implicito @ romaintaz di risposta alla stessa domanda, Maven - skip parent project accumulo

, ma solo per fare questa esplicita, nel genitore POM è imperativo che si specifica l'elemento di imballaggio come pom (e non JAR o la guerra).
Esempio:

<packaging>pom</packaging>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top