Comment spécifier l'organisation distributionManagement de maven à l'échelle?

J'essaie de comprendre comment organiser de nombreux projets (environ 50+) Maven2, afin qu'ils puissent se déployer dans un référentiel nexus central. Lorsque vous utilisez l'objectif mvn deploy, il faut spécifier la cible dans la balise distributionManagement comme ceci:

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

Maintenant, je ne veux pas tous les pompons.xml (de ceux 50+) pour contenir ce bloc encore et encore. Mon premier 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 serait possible, je pourrais le spécifier dans les paramètres.xml dans la distribution maven2, qui pourrait être distribué à tous les développeurs.

La seule solution possible que j'ai trouvée était de créer un projet Master-pom à l'échelle de l'organisation, qui contient ces paramètres et crée tous les autres pom.xml dépend de ce maître-pom via la balise <parent>. Mais cela semble assez étrange dans les constructions multi-modules:

- 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 toute la documentation que le module pdm devrait utiliser le pom parent, pas un autre. Mais après avoir lu le site Web de maven sur L'héritage v. agrégation, il est écrit que c'est en effet possible.

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

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

89
demandé sur Bhargav Rao 2010-07-21 14:10:40

1 réponses

La meilleure solution pour cela est de créer un projet de fichier pom parent simple (avec empaquetage 'pom') génériquement 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 nexus local afin que tout le monde ait accès à son artefact.

Maintenant, pour tous les projets que vous souhaitez utiliser, incluez simplement 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 je voulais standardiser votre utilisation JUnit à une version spécifique, ce serait l'endroit idéal pour cela.

Si vous avez des projets qui utilisent des structures multi-modules qui ont 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 pom parent de votre entreprise et que les modules enfants du projet ne connaissent même pas le parent de votre entreprise.

Je vois à partir de votre exemple de structure de projet que vous essayez pour mettre votre projet parent au même niveau que votre agrégateur pom. 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 agrégateur pom.fichier xml à la racine de l'endroit où tous les répertoires de vos modules existent.

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

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

Nous utilisons ceci exact la solution à mon organisation, et il a résisté à l'épreuve du temps et a très bien fonctionné pour nous.

129
répondu Jesse Webb 2010-07-21 15:45:39