2009-08-28 10 views
102

Je travaille sur un assez grand projet Maven. Nous avons probablement environ 70 artefacts individuels, qui sont grossièrement divisés en deux bibliothèques de code partagé et peut-être dix applications qui les utilisent. Tous ces éléments vivent dans l'espace de noms com.mycompany.*.Comment puis-je empêcher Maven de vérifier les mises à jour d'artefacts d'un certain groupe de maven-central-repo?

La plupart du temps, nous utilisons des générations de snapshots. Donc, pour faire une construction complète d'une application, je peux d'abord construire les projets de la bibliothèque afin qu'ils soient installés dans mon dépôt local (par exemple, mycompany-libname-2.4-SNAPSHOT.jar).

Le problème est que quand je vais ensuite construire les applications. Pour une raison quelconque, Maven veut vérifier les deux principaux référentiels publics (maven-net-repo et java-net-repo) pour les mises à jour de tous les artefacts mycompany-*-SNAPSHOT.jar. Bien sûr, ils ne se trouvent pas là, et tout finit par revenir aux versions que je viens de construire dans mon référentiel local, mais j'aimerais que Maven arrête de faire ça parce que (a) ça me donne l'impression d'être un mauvais net.citizen pour vérifier constamment ces dépôts pour des choses qui ne seront jamais là, et (b) il ajoute une certaine latence de réseau inutile et ennuyeuse dans mon processus de construction.

La plupart du temps, je suis habitué à lancer maven en mode déconnecté pour contourner ce problème, mais ce n'est pas idéal puisque, occasionnellement, une dépendance sur une bibliothèque publique sera mise à jour. Donc, ce que je cherche, c'est une solution qui empêchera Maven de vérifier les mises à jour provenant d'entrepôts donnés pour des artefacts répondant à certains critères - dans ce cas, je serais heureux si Maven ignorait les versions SNAPSHOT ou les artefacts l'espace de noms com.mycompany.

Répondre

26

La balise updatePolicy ne fonctionnait pas pour moi. Cependant, le vendeur averti a mentionné que les instantanés devraient être désactivés de toute façon, j'ai donc regardé plus loin et j'ai remarqué que le référentiel supplémentaire que j'avais ajouté à mon fichier settings.xml était réellement à l'origine du problème. Ajouter la section snapshots à ce dépôt dans mon settings.xml a fait l'affaire!

<repository> 
    <id>jboss</id> 
    <name>JBoss Repository</name> 
    <url>http://repository.jboss.com/maven2</url> 
    <snapshots> 
     <enabled>false</enabled> 
    </snapshots> 
</repository> 
+0

Merci beaucoup pour la réponse. Cela m'a finalement aidé. Je rencontrais quelques problèmes avec les téléchargements d'instantanés pour l'un des dépôts. Les téléchargements étaient suspendus même avec la police de mise à jour jamais. Maintenant, les instantanés ne sont pas téléchargés, ce qui est exactement ce que je voulais. – wolfroma

29

Mise à jour: J'aurais probablement dû commencer avec cela car vos projets sont des SNAPSHOTs. Cela fait partie de la sémantique de SNAPSHOT que Maven va vérifier les mises à jour sur chaque build. Être un SNAPSHOT signifie qu'il est volatile et sujet à changement, donc les mises à jour doivent être vérifiées. Cependant, il vaut la peine de souligner que le Maven super POM configure le central pour que les snapshots soient désactivés, ainsi Maven ne devrait jamais vérifier les mises à jour pour SNAPSHOTs sur le central à moins que vous ne l'ayez remplacé dans vos propres pom/settings.


Vous pouvez configurer Maven pour utiliser un mirror pour le dépôt central, cela rediriger toutes les requêtes qui devraient normalement aller au centre de votre référentiel interne.

Dans votre settings.xml vous ajoutez quelque chose comme ceci pour définir votre référentiel interne comme miroir pour le centre:

<mirrors> 
    <mirror> 
    <id>ibiblio.org</id> 
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name> 
    <url>http://path/to/my/repository</url> 
    <mirrorOf>central</mirrorOf> 
    </mirror> 
</mirrors> 

Si vous utilisez un gestionnaire de référentiel comme Nexus pour votre référentiel interne. Vous pouvez configurer un proxy repository pour le proxy central, de sorte que toutes les demandes normalement envoyées à Central sont envoyées à votre référentiel proxy (ou un repository group contenant le proxy), et les demandes suivantes sont mises en cache dans le gestionnaire de référentiel interne. Vous pouvez même définir le délai d'expiration du cache proxy sur -1, de sorte qu'il ne demandera jamais de contenu provenant du système central qui se trouve déjà dans le référentiel proxy.


Une solution plus basique si vous ne travaillez avec des référentiels locaux est de définir le updatePolicy pour le dépôt central de « jamais », cela signifie que Maven ne jamais vérifier les artefacts qui ne sont pas déjà en le référentiel local. Cela peut ensuite être remplacé sur la ligne de commande si nécessaire en utilisant l'option -U pour forcer Maven à vérifier les mises à jour.

Vous devez configurer le référentiel (dans votre pom ou un profil dans les paramètres.xml) comme suit:

<repository> 
    <id>central</id> 
    <url>http://repo1.maven.org/maven2</url> 
    <updatePolicy>never</updatePolicy> 
</repository> 
+0

Nous avons effectivement un dépôt central déjà, mais bien sûr, nous ne publions pas de builds de snapshots, donc je suppose que j'obtiendrais toujours des vérifications de mise à jour ratées avec le proxy/miroir en place - je cherche un moyen pour que Maven ne vérifie pas du tout les mises à jour de ces artefacts. –

+1

Cela vaut également la peine de configurer un référentiel logique sur votre référentiel central pour vos SNAPSHOT. Cela signifie qu'ils peuvent être partagés entre vos développeurs et vous ne devez pas tous les construire localement. Vous profiterez alors pleinement des SNAPSHOT en sélectionnant les modifications apportées aux dépendances SNAPSHOT dès qu'elles sont transférées vers le référentiel distant. –

+0

Merci - le drapeau updatePolicy ressemble exactement à ce que je cherchais. –

135

En outre, vous pouvez utiliser -o ou --offline dans la ligne de commande mvn qui mettra Maven en mode « offline » il ne vérifie pas les mises à jour. Vous obtiendrez un avertissement de ne pas être en mesure d'obtenir des dépendances pas déjà dans votre dépôt local, mais pas de gros problème.

+6

Cela empêchera également maven de télécharger les dépendances publiées. Vous voudrez peut-être une version plus récente de la librairie publiée, sans que les instantanés ne soient vérifiés pour la mise à jour – hobgoblin

+1

Ceci n'est CLAIREMENT PAS une réponse à la question originale! Comment peut-il avoir autant de upvotes ??? L'OP a explicitement écrit qu'il a essayé de lancer maven en mode déconnecté mais ce n'est pas idéal pour son but! –

0

J'ai eu des ennuis semblables à cela,

<repository> 
    <id>java.net</id> 
    <url>https://maven-repository.dev.java.net/nonav/repository</url> 
    <layout>legacy</layout> 
</repository> 
<repository> 
    <id>java.net2</id> 
    <url>https://maven2-repository.dev.java.net/nonav/repository</url> 
</repository> 

Réglage du updatePolicy à « jamais » ne fonctionnait pas. Retrait de ces repo était la façon dont je l'ai résolu. ps: je suivais ce tutorial sur les services Web (BTW, probablement le meilleur tutoriel pour ws java)

+1

Utilisez-vous Intellij? Parce que Intellij + Maven = ignore updatePolicy. Voir le rapport de bug http://youtrack.jetbrains.com/issue/IDEA-76869 – Manav

75

Quelque chose qui est désormais disponible en Maven est bien

mvn goal --no-snapshot-updates 

ou en bref

mvn goal -nsu 
+2

Juste au cas où des gens de SBT atterriraient ici: '' 'set offline: = true''' dans la session, ou' '' offline: = true''' dans '' 'build.sbt'''. – opyate

+4

En outre, l'option 'nsu' est rompue dans v 3.0.3 (voir [** MNG-5064 **] (http://jira.codehaus.org/browse/MNG-5064)). Pour utiliser cette option de manière fiable, vous devrez peut-être passer à atleast v. 3.0.4 ou v. 3.0.5 –

4

Très simple:

Dans votre parent Super POM ou setting.xml, utilisez

 <repository> 
     <id>central</id> 
     <releases> 
      <updatePolicy>never</updatePolicy> 
     </releases> 
     <snapshots> 
      <updatePolicy>never</updatePolicy> 
     </snapshots> 
     <url>http://repo1.maven.org/maven2</url> 
     <layout>legacy</layout> 
    </repository> 

Ce sont mes conseils

Questions connexes