66 votes

Quel est le meilleur endroit pour spécifier les dépôts maven, pom.xml ou settings.xml ?

Quel est le meilleur endroit pour spécifier les dépôts requis pour les projets maven ? pom.xml ou settings.xml ? Quels sont les avantages et les inconvénients de chaque emplacement ? Quelle est la meilleure pratique ?

Il me semble que définir les référentiels dans le POM est préférable pour un certain nombre de raisons :

  • Reproductibilité : Les artefacts dépendants proviennent d'un emplacement connu qui est explicitement déclaré dans le POM. Il y a également moins de risques que les dépôts mal configurés d'un utilisateur causent des problèmes.
  • Portabilité : Ce POM sera construit sur n'importe quelle machine avec maven installé. Il n'y a pas d'exigences supplémentaires sur les paramètres de référentiel configurés par l'utilisateur.
  • Facilité d'utilisation : Il est plus facile pour les nouveaux développeurs de récupérer et de construire le projet car il y a moins de configuration à mettre en place.

L'inconvénient est peut-être que si l'emplacement du dépôt change à l'avenir, il faut installer des proxies ou publier des correctifs de l'ancien logiciel en spécifiant les nouveaux emplacements du dépôt (ou des correctifs de l'ancien logiciel). .m2/settings.xml peut toujours fournir des référentiels supplémentaires en dernier recours). Cependant, cela semble être une ramification nécessaire d'une bonne reproductibilité et portabilité dans la gestion des versions plutôt qu'un contre.

D'autres idées ?

2 votes

Si l'emplacement du dépôt change, il suffit de mettre à jour le pom et de s'assurer que tout le monde rafraîchit sa copie locale.

0 votes

C'est vrai, mais les anciennes versions ont probablement été publiées sous forme de distribution (ex : zip, tar.gz). L'un des avantages de la reproductibilité est que vous pouvez prendre n'importe quelle distribution/version, appliquer un patch pour n'importe quelle raison et vous avez la garantie d'obtenir la distribution fonctionnelle exacte plus votre patch et rien d'autre.

1 votes

Mon opinion est exactement la même que celle de @jnorris, mais Sonatype propose quelques points à prendre en compte (peut-être dépassés ?) concernant l'élimination des URL de vos fichiers POM distribués : blog.sonatype.com/2009/02/

62voto

Pascal Thivent Points 295221

Quel est le meilleur endroit pour spécifier les dépôts requis pour les projets maven, pom.xml ou settings.xml ? Quels sont les avantages et les inconvénients de chaque emplacement ? Quelle est la meilleure pratique ?

Je définirais personnellement les dépôts requis par un projet particulier dans le projet pom.xml car cela permet de garder la construction portable. Le site settings.xml ne devrait être utilisé que pour des choses spécifiques à l'utilisateur ou secrètes, à mon avis. Non vraiment, demander à l'utilisateur d'ajouter des emplacements de dépôt, même si cela est correctement documenté, défait en quelque sorte une des caractéristiques de maven (gestion transparente des dépendances) et je n'aime pas cette idée.

Le seul "bon" cas d'utilisation que je peux imaginer pour utiliser settings.xml pour traiter les dépôts est lorsque vous avez un dépôt d'entreprise et que vous voulez que Maven utilise ce dépôt au lieu des dépôts publics. Par exemple, pour éviter les connexions à tout le référentiel public, vous déclarerez le référentiel d'entreprise comme un miroir de tous ces référentiels :

<settings>
  ...
  <mirrors>
    <mirror>
      <id>proxy-of-entire-earth</id>
      <mirrorOf>*</mirrorOf>
      <name>Maven Repository Manager running on repo.mycompany.com</name>
      <url>http://repo.mycompany.com/proxy</url>
    </mirror>
  </mirrors>
  ...
</settings>

0 votes

+1. Cela a clarifié les "et si" auxquels je pensais en me débattant moi-même avec cette question. 1) Que faire si le miroir "disparaît" et que vous devez en fournir un nouveau (si le projet n'est pas maintenu et que vous voulez garder l'arbre des sources intact) ? Configurez un miroir dans settings.xml 2) Que faire si vous voulez utiliser un repot local privé uniquement dans certains environnements ? Utilisez un miroir joker dans settings.xml comme vous l'avez suggéré.

0 votes

Pour information, cette information se trouve maintenant aussi dans les documents de Maven. maven.apache.org/guides/mini/

1 votes

Si vous avez un dépôt d'entreprise et que vous construisez un projet pour un client et que vous devez livrer le code source à la fin, il vaut mieux configurer les dépôts dans settings.xml. Vous ne voulez pas que votre Artifactory (ou similaire) soit atteint chaque fois que le projet est construit en dehors de votre bureau.

15voto

Larry Shatzer Points 1593

Je recommande de lire ce article de blog sur le sujet.

9voto

Gili Points 14674

Je vais vous donner trois raisons pour lesquelles vous devriez envisager de stocker les URL de référentiel dans settings.xml au lieu de pom.xml :

  1. spekdrum a mentionné quelque chose qui nous est réellement arrivé :

Si vous avez un dépôt d'entreprise et que vous construisez un projet pour un client et que vous devez livrer le code source à la fin, il vaut mieux configurer les dépôts dans settings.xml. Vous ne voulez pas que votre Artifactory (ou similaire) soit atteint chaque fois que le projet est construit en dehors de votre bureau.

  1. Les gars de Sonatype recommander en plaçant les URL dans settings.xml .

  2. Si le référentiel de dépendances tombe en panne (pensez à java.net ), vous ne devez corriger l'URL qu'à un seul endroit. Si vous avez utilisé pom.xml toutes les versions précédentes sont cassées. Vous devez potentiellement livrer une version corrigée pom.xml par version.

La configuration des URLs dans settings.xml plus de travail que pom.xml ? Absolument.

Cela vous donne-t-il plus de flexibilité ? Absolument.

Voici ce que settings.xml devrait ressembler :

<settings>
    <profiles>
        <profile>
            <id>mycompany-servers</id>
            <repositories>
                <repository>
                    <id>mycompany-release</id>
                    <url>https://mycompany.com/release/</url>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>mycompany-snapshot</id>
                    <url>https://mycompany.com/snapshot/</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                </repository>
            </repositories>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>mycompany-servers</activeProfile>
    </activeProfiles>
    <servers>
        <server>
            <id>mycompany-release</id>
            <username>your-username</username>
            <password>your-api-key</password>
        </server>
        <server>
             <id>mycompany-snapshot</id>
             <username>your-username</username>
             <password>your-api-key</password>
        </server>
    </servers>
</settings>

4voto

Steven Points 454

Je mets toujours les URLs dans le POM et les mots de passe dans settings.xml. Si vous mettez les URL dans settings.xml, vous obligez vos utilisateurs à mettre à jour les fichiers sur leurs systèmes locaux si jamais votre URL change. Si l'URL est spécifiée dans votre POM, vous pouvez la modifier et pousser une nouvelle version. Les URL changent plus souvent qu'on ne peut le prévoir, ce qui entraîne la frustration des utilisateurs en cas de rupture de la construction.

Les mots de passe sont conservés dans settings.xml pour des raisons évidentes. Les mots de passe ne doivent jamais être conservés dans le contrôle de version. Vous aurez besoin de mots de passe pour la fonctionnalité mvn deploy afin de déployer vers des dépôts distants.

0 votes

Pour voir un exemple de la façon dont ~/.m2/settings.xml devrait être configuré, voir stackoverflow.com/questions/2941605/

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