web-dev-qa-db-fra.com

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

J'essaie de comprendre comment organiser de nombreux projets Maven2 (environ 50+), afin qu'ils puissent être déployés dans un référentiel central de liens. Lorsque vous utilisez le mvn deploy but, il faut spécifier la cible dans le tag distributionManagement comme ceci:

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

Maintenant, je ne veux pas que chaque pom.xml (parmi les 50 ans et plus) contienne ce bloc encore et encore. Mon premier serait le settings.xml _, mais il semble qu’il soit impossible (par conception) de le définir ici. 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ée consiste à créer un projet maître-pom à l’échelle de l’entreprise, contenant ces paramètres, et de faire en sorte que tous les autres pom.xml dépendent de ce maître-pom via <parent> tag. Mais cela semble étrange dans les versions 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 poms devrait utiliser le pom parent, pas un autre. Mais après avoir lu le site Web maven sur Inheritance v. Aggregation, il est écrit que c'est effectivement possible.

Un problème que j’ai trouvé était lié à la génération du 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 directe).

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

100
mglauche

La meilleure solution consiste à créer un projet de fichier pom parent simple (avec l’emballage 'pom') de manière 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, publié et déployé sur votre lien 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 éléments communs à tous les projets de votre entreprise. Par exemple, si vous souhaitez normaliser votre utilisation de JUnit avec une version spécifique, ce serait l'endroit idéal pour cela.

Si vous avez des projets utilisant des structures multi-modules ayant leur propre parent, Maven prend également en charge le chaînage de l'héritage. Il est donc parfaitement acceptable de faire en sorte que le fichier pom parent de votre projet fasse référence au pom parent de votre société et que les modules enfants du projet ne soient même pas conscients de votre contenu. société mère.

Je vois dans votre exemple de structure de projet que vous essayez de placer 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 consiste à l'inclure au même niveau que le reste des modules et à placer votre fichier d'agrégation pom.xml à la racine de l'emplacement 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 d’inclure votre module parent dans l’agrégateur et de tout construire avec un mvn install du répertoire racine.

Nous utilisons cette solution exacte dans mon entreprise, qui a fait ses preuves et a très bien fonctionné pour nous.

136
Jesse Webb

Il n'y a pas besoin d'un POM parent.

Vous pouvez omettre entièrement la partie distributionManagement dans vos poms et la définir soit sur votre serveur de construction, soit dans settings.xml.

Pour le faire sur le serveur de compilation, il suffit de passer à la commande mvn:

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/releases

Voir https://maven.Apache.org/plugins/maven-deploy-plugin/deploy-mojo.html pour plus de détails sur les options pouvant être définies.

Il est également possible de définir ceci dans votre settings.xml.

Créez simplement un profil qui est activé et contient la propriété.

Exemple settings.xml:

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

Assurez-vous que les informations d'identification pour les "instantanés" et les "versions" se trouvent dans le fichier <servers> section de votre fichier settings.xml

8
Michael Wyraz