2011-10-21 14 views
10

Abbiamo un modulo di Maven che è impostato come così:Maven - includere tutti i sottomoduli di un pom come dipendenze in un altro modulo

a (parent) 
    -> b (submodule) 
    -> c (submodule) 
    -> d (submodule) 

Questa lista di sottomoduli è destinata a crescere col passare del tempo (per un elenco di circa 20). Abbiamo un altro modulo che includerà come dipendenze tutti i sottomoduli di a. C'è un modo accurato per farlo, piuttosto che dover mantenere manualmente l'elenco dei sottomoduli in sincronia con l'elenco delle dipendenze. Cioè esiste un modo per includere tutti i sottomoduli come dipendenza?

risposta

0

L'unico modo in cui le dipendenze vengono "automaticamente" incluse è tramite il meccanismo di dipendenza transitiva, e funziona solo estrapolando le dipendenze delle dipendenze, quindi a meno che non si abbia un pom che dipende da tutti i sottomoduli, no, non lo si prendili senza elencarli tutti. Una necessità di fare questo indica un difetto nella progettazione del progetto. Se i moduli sono "tutto o nessuno", probabilmente non sono moduli separati.

3

Avete alcune scelte qui:

  1. Nessun cambiamento. Elenca tutte le dipendenze in ogni pom. Tuttavia, se hanno un genitore comune, puoi usare dependencyManagement nel genitore principale per impostare le versioni per le diverse dipendenze. Nei poms figlio, non è necessario elencare la versione. Vedi this section from Maven By Example. Uno svantaggio di questo approccio è che devi ri-elencare le stesse dipendenze più e più volte.
  2. Creare un padre genitore che elenca tutte le dipendenze condivise. Guarda un esempio here. Uno svantaggio è che stai limitando tutti i progetti che vogliono trarne vantaggio per utilizzare un progetto padre quando potrebbero aver bisogno di utilizzare un altro progetto padre per qualche motivo.
  3. Attendere Maven mixins, che l'ultima volta che ho sentito erano still not ready.
  4. Ripensa il tuo design. Ha senso che i progetti dipendano da così tanti diversi moduli e interfacce? Per ridurre coupling, è possibile creare un'interfaccia che possono essere utilizzati da questi nuovi progetti. Diversi progetti multi-modulo open source, come Apache Axis2, seguono questo schema. Un modulo contiene le 20 dipendenze ed espone un'interfaccia che i nuovi moduli possono chiamare. I nuovi moduli possono solo elencare quel modulo principale come dipendenza e tutte le 20 dipendenze vengono introdotte come dipendenze transitive.

Penso che la scelta numero 4 abbia probabilmente ragione, ma non conosco abbastanza bene la situazione.

+0

Ho un problema simile. l'approccio n. 4 sembra una buona opzione. Sarebbe utile se/potessi indicarmi qualche esempio per l'approccio # 4? –

1

Considerazioni di progettazione a parte, questo è fatto facilmente - semplicemente includere <type>pom</type> nella dipendenza che punta al padre pom. E.g:

<dependency> 
    <groupId>my.group.id</groupId> 
    <artifactId>a</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <type>pom</type> 
</dependency> 
Problemi correlati