2013-07-05 17 views
10

Abbiamo una struttura di modulo grande e profonda con tre livelli "reali" di ereditarietà e da tre a quattro livelli di aggregazione di moduli.maven module inheritance vs aggregation

sto bene con la vera eredità: una vasta società super-pom, un genitore a livello di prodotto e di un genitore a livello di clienti per le personalizzazioni del prodotto.

Ma osservare che anche i moduli aggreganti "vuoti" sono definiti come genitori dei loro sottomoduli.

Se l'intero concetto è lo stesso di OO, questo non ha senso per me se i moduli di aggregazione (sono vuoti oltre ai loro sottomoduli) non aggiungono alcuna configurazione specifica al pom.

C'è qualche altro motivo (forse operativa) il motivo per cui questo potrebbe essere utile?

Nota a margine: Introduzione alla pom non è chiaro a questo proposito: termine "padre" non è chiara: può significare super-pon (= genitore in albero di ereditarietà) o POM aggregazione (= genitore in file system ...)

+0

questo non risponde alla domanda, ma se si è separata l'aggregazione dall'ereditarietà (che anch'io tendo a fare) perché si eredita dai poms di aggregatori? nei poms che vengono aggregati non specificare una sezione o ereditare dal tuo genitore reale. In sostanza, _ i moduli di aggregazione "vuoti" sono definiti come i genitori dei loro sottomoduli_ non è obbligatorio. non farlo se non ha senso – Hilikus

risposta

12

C'è un grande problema nella definizione di questi concetti nella comunità Maven. Hai ragione con affermando che un genitore-pom è eredità e modulo-pom è composizione. Ma sfortunatamente la separazione di questi due concetti non ha una storia in comune. La documentazione di Maven dice chiaramente che è meglio separarli. Ciò risulterebbe in questa struttura ideale

app-api/ 
app-impl/ 
app-war/ 
app-parent/ 
pom.xml 

Dove pom.xml è il modulo pom.

Ma quasi tutti i progetti si vedrà nel settore open source non fa distinzione tra di loro.

Questo ha una ragione: Molti plugin non distiguish tra loro. Ed anche lo stesso maven assume un'altra impostazione: Se <relativePath> non è impostato, Maven presuppone che il genitore sia a ... Quindi ogni progetto deve puntare a <relativePath>../app-parent</relativePath> come genitore.

Il plugin più popolare che ha enormi problemi con la struttura menzionato è l'esperto-release-plugin! Dovrai affrontare strani problemi quando non segui il presupposto che il modulo-pom sia il genitore-pom.

Il peggio bug è che il rilascio-plugin non può sostituire version-proprietà a un genitore e non riesce a causa di snapshot dipendenze. Il tuo genitore forse conterrà qualcosa come questo

<properties> 
    <app-api.version>1.1-SNAPSHOT</app-api.version> 
    <app-impl.version>1.2-SNAPSHOT</app-impl.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>myorg</groupId> 
      <artifactId>app-api</artifactId> 
      <version>${app-api.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>myorg</groupId> 
      <artifactId>app-impl</artifactId> 
      <version>${app-impl.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Normalmente durante il rilascio di queste proprietà sarebbe automaticamente essere impostato per le loro versioni di rilascio 1.1 e 1.2. Ma il release-plugin (testato fino alla versione 2.2.2) non riesce con un messaggio che il modulo non può essere rilasciato con dipendenze snapshot.

Se solo "saltare" alcuni moduli-pon questo potrebbe non essere un problema quando si definisce <relativePath> correttamente. Ma devi cercare di aspettarti alcuni bug nei plugin di Maven. Oltre a questi bug hai perfettamente ragione a separare i poms e farei una prova se hai il tempo di fare una versione sandbox.

+2

Un altro modo per giustificare il modo migliore per farlo è che questo fornisce "separazione delle preoccupazioni". Separando le nozioni di ereditarietà e di aggregazione, entrambe possono essere più flessibili. –

0

L'eredità di un pom genitore è utile se si dispone di proprietà che sono validi per diversi progetti.Da quello che ho capito, hai già ottenuto quella parte ;-)

Ciò che chiamate moduli di aggregazione ha anche un valido uso pratico. È possibile raggruppare diversi sottomoduli in un unico pom. Se vuoi costruire il tuo progetto, per lo più non vuoi costruire tutti i moduli, ma unirli in un'unica applicazione. Questo può essere fatto da un tale pom che fa riferimento a tutti i sottomoduli in quanto tali. Non può essere fatto solo con il concetto di un padre genitore poiché non conosce nulla degli altri moduli.

0

La risposta breve IIUC è che non si eredita dai propri poms di aggregazione. Lo fai quando il tuo aggregatore è uguale al tuo genitore, come nella struttura canonica dei maven. Ma se si separa l'aggregatore dal genitore, non si eredita dall'aggregatore