2010-07-21 10 views
84

J'essaie de comprendre comment organiser de nombreux projets (environ 50+) maven2, afin qu'ils puissent être déployés dans un référentiel central Nexus. Lorsque vous utilisez l'objectif mvn deploy, on n'a pas besoin de spécifier la cible dans la balise distributionManagement comme ceci:Comment spécifier l'organisation distributionManagement de maven?

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

Maintenant, je ne veux pas tout seul pom.xml (ceux 50+) pour contenir ce bloc sur et encore. Mon premier mais serait le fichier settings.xml, mais il semble qu'il n'est pas possible (par conception) de le définir là. Donc, la première question serait, pourquoi est-ce le cas? Si cela était possible, je pourrais le spécifier dans le fichier settings.xml de la distribution maven2, qui pourrait être distribué à tous les développeurs. La seule solution possible que j'ai trouvé était de créer un projet master-pom à l'échelle de l'organisation, qui contient ces paramètres, et de faire dépendre tout autre pom.xml de ce maître-pom via la balise <parent>. Mais cela semble un peu étrange dans plusieurs modules construit:

- 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) 

Habituellement je lis dans tous les documents que le module poms doivent utiliser la pom-mère, pas un différent. Mais après avoir lu le site Web de Maven sur l'héritage v. Agrégation il est écrit que c'est effectivement possible.

Un problème que j'ai trouvé avec la génération de site Maven, qui ne semble avoir des problèmes avec cette configuration (modules ne sont pas liés correctement s'ils ont pas de back-référence directe)

Alors, est-ce valide approche? Toute autre solution, plus évidente, plus simple au problème?

+1

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

+4

@OhadR: Ils écrivent seulement comment l'écrire dans un projet. Le point est que je ne voulais pas le reproduire environ 500 fois ... – mglauche

+1

je vois. point pris. alors que celui qui a répondu a dit, vous pouvez avoir un pom principal pour le projet, qui contiendra le 'distribMngmnt' ... – OhadR

Répondre

124

La meilleure solution pour cela est de créer un projet de fichier parent pom simple (avec empaquetage 'pom') générique pour tous les projets de votre organisation.

<?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> 

Cela peut être construit, libéré, et déployé sur votre lien local pour tout le monde a accès à son artefact.

Maintenant, pour tous les projets que vous souhaitez l'utiliser, il suffit d'inclure cette section:

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

Cette solution vous permettra d'ajouter facilement d'autres choses communes à tous les projets de votre entreprise. Par exemple, si vous vouliez normaliser votre utilisation de JUnit à une version spécifique, ce serait l'endroit idéal pour cela. Si vous avez des projets qui utilisent des structures multi-modules possédant leur propre parent, Maven prend également en charge l'héritage de chaînage. Il est donc parfaitement acceptable que le fichier pom parent de votre projet se réfère au parent pom de votre entreprise. même conscient du parent de votre entreprise.

Je vois dans votre exemple de structure de projet que vous essayez de mettre votre projet parent au même niveau que votre pom agrégateur. Si votre projet a besoin de son propre parent, la meilleure approche que j'ai trouvée est d'inclure le parent au même niveau que le reste des modules et d'avoir votre fichier agrégateur pom.xml à la racine de tous les répertoires de vos modules.

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

Ce que vous faites avec cette structure est inclure votre module parent dans l'agrégateur et tout construire avec « mvn install » à partir du répertoire racine.

Nous utilisons cette solution exacte dans mon organisation et elle a résisté à l'épreuve du temps et a très bien fonctionné pour nous.

+2

Je ne connaissais pas l'héritage de chaînage, bon point! – mglauche

+0

Voici une autre réponse où je décris l'héritage de projet plus en détail et comment gérer sa complexité héritée, pardonnez le jeu de mots. ;) http://stackoverflow.com/questions/6347913/ –

+7

Juste une petite note: pour les raisons * pourquoi * le parent de l'entreprise est la meilleure solution, voir la discussion [Impossible de spécifier distributionManagement dans settings.xml] (http : //maven.40175.n5.nabble.com/Can-t-specify-distributionManagement-in-settings-xml-td3181781.html) dans la liste des utilisateurs de Maven. –