2010-07-21 10 views
84

Sto cercando di capire come organizzare molti (circa 50) progetti maven2, in modo che possano essere distribuiti in un repository centrale di nexus. Quando si utilizza l'obiettivo mvn deploy, uno ha bisogno di specificare la destinazione nel tag distributionManagement in questo modo:Come specificare la distribuzione di mavenGestione manageriale ampia?

<distributionManagement> 
    <repository> 
     <id>nexus-site</id> 
     <url>http://central_nexus/server</url> 
    </repository> 
</distributionManagement> 

Ora, non voglio ogni singolo pom.xml (di quelli 50+) per contenere questo blocco su e ancora. Il mio primo pensiero sarebbe il file settings.xml, ma sembra che non sia possibile (in base alla progettazione) definirlo lì. Quindi, la prima domanda sarebbe: perché è così? Se fosse possibile potrei specificarlo in settings.xml nella distribuzione di maven2, che potrebbe essere distribuita a tutti gli sviluppatori.

L'unica soluzione possibile che ho trovato è stata quella di creare un progetto master-pom a livello di organizzazione, che contenga queste impostazioni e che tutti gli altri pom.xml dipendano da questo master-pom tramite il tag <parent>. Ma questo sembra un po 'strano in multi-modulo costruisce:

- master configuration POM (pm) 
- Project 1 parent pom (p1 with module 1 and module 2 as modules) 
    - Project 1 module pom (with pm as parent) 
    - Project 2 module pom (with pm as parent) 

Di solito ho letto tutta la documentazione che i pon modulo dovrebbe utilizzare il pom genitore, non un po' diverso uno. Ma dopo aver letto il sito web Maven su Inheritance v. Aggregation è scritto che è davvero possibile.

Un problema che ho trovato è stato con la generazione sito Maven, che non sembrano avere problemi con questa configurazione (moduli non venga collegate correttamente se non hanno alcun back-riferimento diretto)

Quindi, si tratta di una valida approccio ? Qualunque altra soluzione più ovvia e semplice al problema?

+1

http://maven.apache.org/pom.html#Distribution_Management – OhadR

+4

@ OhadR: scrivono solo come scriverlo in un progetto. Il punto è che non volevo duplicarlo circa 500 volte ... – mglauche

+1

vedo. punto preso. così come colui che ha risposto ha detto, puoi avere un main pom per il progetto, che conterrà il 'distribMngmnt' ... – OhadR

risposta

124

La soluzione migliore è creare un semplice progetto di file padre (con l'imballaggio "pom") genericamente per tutti i progetti dell'organizzazione.

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>your.company</groupId> 
    <artifactId>company-parent</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <distributionManagement> 
     <repository> 
      <id>nexus-site</id> 
      <url>http://central_nexus/server</url> 
     </repository> 
    </distributionManagement> 

</project> 

Questo può essere costruito, ha pubblicato, e distribuito al nesso locale in modo tutti hanno accesso ad esso è artefatto.

Ora, per tutti i progetti che si desidera utilizzarlo, è sufficiente includere questa sezione:

<parent> 
    <groupId>your.company</groupId> 
    <artifactId>company-parent</artifactId> 
    <version>1.0.0</version> 
</parent> 

Questa soluzione vi permetterà di aggiungere facilmente altre cose comuni a tutti i progetti della vostra azienda. Ad esempio, se si desidera standardizzare l'utilizzo di JUnit a una versione specifica, questo sarebbe il posto perfetto.

Se si dispone di progetti che utilizzano strutture multi-modulo con un proprio genitore, Maven supporta anche il concatenamento dell'ereditarietà, quindi è perfettamente accettabile fare in modo che il file pom del progetto si riferisca al padre gen della propria azienda e avere i moduli figlio del progetto non anche a conoscenza del genitore della tua azienda.

Vedo dalla struttura del progetto di esempio che si sta tentando di mettere il proprio progetto padre allo stesso livello del proprio aggregator pom. Se il tuo progetto ha bisogno del proprio genitore, l'approccio migliore che ho trovato è quello di includere il genitore allo stesso livello del resto dei moduli e avere il tuo file aggregatore pom.xml alla radice di dove esistono tutte le directory dei tuoi moduli.

- pom.xml (aggregator) 
    - project-parent 
    - project-module1 
    - project-module2 

Quello che fai con questa struttura è di includere il modulo padre nella aggregatore e costruire il tutto con un 'mvn install' dalla directory principale.

Usiamo questa soluzione esatta presso la mia organizzazione e ha superato la prova del tempo e ha funzionato abbastanza bene per noi.

+2

Non sapevo dell'ereditarietà concatenata, buon punto! – mglauche

+0

Ecco un'altra risposta in cui descrivo l'ereditarietà del progetto in modo più dettagliato e in che modo gestirne la complessità ereditaria, scusate il gioco di parole. ;) http://stackoverflow.com/questions/6347913/ –

+7

Solo una piccola nota: per i motivi * perché * la società madre è la soluzione migliore, consultare la discussione [Impossibile specificare distributionManagement in settings.xml] (http : //maven.40175.n5.nabble.com/Can-t-specify-distributionManagement-in-settings-xml-td3181781.html) dall'elenco degli utenti di Maven. –

Problemi correlati