132 votes

Comment spécifier maven ' organisation de distributionManagement s large ?

Je suis à essayer de comprendre comment organiser de nombreux (autour de 50+) maven2 projets, afin qu'ils puissent déployer dans une centrale nexus référentiel. Lors de l'utilisation de l' mvn deploy de l'objectif, on n'a pas besoin de spécifier la cible dans la distributionManagement balise comme ceci:

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

Maintenant, je ne veux pas tout seul pom.xml (de ces 50+) pour contenir ce bloc, encore et encore. Mon premier serait l' settings.xml le fichier, mais il semble qu'il n'est pas possible (par conception) de la définir. Donc, la première question serait, pourquoi est-ce le cas ? Si il serait possible que j'ai pu l'indiquer dans la settings.xml dans le maven2 de distribution, ce qui pourrait être distribué à tous les développeurs.

La seule solution que j'ai trouvé a été de créer une organisation à l'échelle de maître-pom du projet, qui ne contiennent pas ces paramètres, et de prendre toutes les autres pom.xml dépendent de ce maître-pom via <parent> balise. Mais cela semble un peu étrange en multi-module s'appuie:

- 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, j'ai lu dans tous les documents que le module pdm devrait utiliser le pom parent, pas un autre. Mais après la lecture de l'maven site web à propos de l'Héritage v. Agrégation, il est écrit qu'il est effectivement possible.

Un problème que j'ai trouvé était avec le maven site de génération, qui ne semblent avoir des problèmes avec cette configuration (modules ne sont pas raccordés correctement si elles n'ont pas directement référence arrière)

Alors, est-ce une approche valable ? Tout autre, la plus évidente, la plus simple solution de ce problème ?

159voto

Jesse Webb Points 8015

La meilleure solution pour cela est de créer un simple parent pom fichier de projet (avec l'emballage 'pom') de façon 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>

Ce peut être construit, libéré, et déployé à votre nexus donc tout le monde a accès à son artefact.

Maintenant, pour tous les projets qui 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 à l'ensemble de vos projets de l'entreprise. Par exemple, si vous avez voulu normaliser votre JUnit l'utilisation d'une version spécifique, ce serait un endroit parfait pour cela.

Si vous avez des projets que l'utilisation de multi-module de structures qui disposent de leur propre parent, Maven prend également en charge le chaînage de l'héritage de sorte qu'il est parfaitement acceptable de faire de votre projet parent pom fichier, reportez-vous à votre société mère de la société pom et le projet de l'enfant, les modules sont même pas conscients de votre société mère de la société.

Je vois de votre exemple de structure de projet que vous tentez de mettre votre projet parent au même niveau que votre agrégateur pom. Si votre projet a besoin de sa propre mère, la meilleure approche que j'ai trouvé est d'inclure le parent au même niveau que le reste des modules et avoir votre agrégateur pom.xml fichier à la racine de l'endroit où tous vos modules répertoires 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 tout construire avec un "mvn install' à partir du répertoire racine.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X