Comment puis-je faire en sorte que Maven arrête d'essayer de vérifier les mises à jour des artefacts d'un certain groupe à partir de maven-central-repo?

126

Je travaille sur un assez gros projet Maven. Nous avons probablement environ 70 artefacts individuels, qui sont à peu près 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.*.

La plupart du temps, nous utilisons des compilations de snapshots. Donc, pour faire une compilation complète d'une application, je pourrais d'abord construire les projets de bibliothèque afin qu'ils soient installés dans mon référentiel local (comme, par exemple, mycompany-libname-2.4-SNAPSHOT.jar).

Le problème est que lorsque je vais ensuite créer 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 mycompany-*-SNAPSHOT.jarartefacts. Bien sûr, ils ne sont pas trouvés là-bas, et tout finit par revenir aux versions que je viens de créer dans mon référentiel local, mais j'aimerais que Maven arrête de faire cela parce que (a) cela me fait me sentir comme un mauvais net. pour vérifier constamment ces référentiels pour des choses qui ne seront jamais là, et (b) cela ajoute une latence réseau inutile et ennuyeuse dans mon processus de construction.

J'ai commencé à exécuter maven en mode hors ligne la plupart du temps pour contourner ce problème, mais ce n'est pas l'idéal car parfois une dépendance à une bibliothèque publique sera mise à jour. Donc, ce que je recherche, c'est une solution qui empêchera Maven de vérifier les mises à jour des référentiels donnés pour les artefacts qui répondent à certains critères - dans ce cas, je serais heureux si Maven ignorait les versions de SNAPSHOT ou les artefacts qui étaient dans l' com.mycompanyespace de noms.

Tim Gilbert
la source

Réponses:

34

La balise updatePolicy ne fonctionnait pas pour moi. Cependant, Rich Seller 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 settings.xml était à l'origine du problème. L'ajout de la section des instantanés à ce référentiel 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>
Dennis Lassing
la source
Merci beaucoup pour la réponse. Cela m'a finalement aidé. J'éprouvais des problèmes avec les téléchargements d'instantanés pour l'un des référentiels. Les téléchargements étaient suspendus même avec la police de mise à jour jamais. Désormais, les instantanés ne sont pas téléchargés, ce qui est exactement ce que je voulais.
wolfroma
163

De plus, vous pouvez utiliser -oou --offlinedans la ligne de commande mvn qui mettra maven en "mode hors ligne" afin qu'il ne vérifie pas les mises à jour. Vous recevrez un avertissement indiquant que vous ne pourrez pas obtenir des dépendances qui ne sont pas déjà dans votre dépôt local, mais ce n'est pas grave.

Jeff Tsay
la source
8
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 bibliothèque publiée, sans que les instantanés ne soient vérifiés pour la mise à jour
hobgoblin
2
Ce n'est clairement pas une réponse à la question initiale! Comment peut-il avoir autant de votes positifs ??? L'OP a explicitement écrit qu'il a essayé d'exécuter maven en mode hors ligne, mais ce n'est pas idéal pour son objectif!
Honza Zidek
95

Quelque chose qui est maintenant disponible dans maven est

mvn goal --no-snapshot-updates

ou en bref

mvn goal -nsu
joostschouten
la source
3
Juste au cas où des gens de SBT atterriraient ici: set offline := truedans la session ou offline := truedans build.sbt.
opyate
5
De plus, l' nsuoption est interrompue dans la version 3.0.3 (voir MNG-5064 ). Pour utiliser cette option de manière fiable, vous devrez peut-être effectuer une mise à niveau vers au moins la version 3.0.4 ou la version 3.0.5
Ashutosh Jindal
pretty the best
AntJavaDev
32

Mise à jour: J'aurais probablement dû commencer par ceci car vos projets sont des INSTANTANÉS. Cela fait partie de la sémantique SNAPSHOT que Maven vérifiera les mises à jour sur chaque build. Être un SNAPSHOT signifie qu'il est volatil et sujet à changement, donc les mises à jour doivent être vérifiées. Cependant, il convient de souligner que le super POM de Maven configure le central pour désactiver les instantanés.Maven ne devrait donc jamais vérifier les mises à jour des SNAPSHOTs sur le central à moins que vous n'ayez remplacé cela dans votre propre pom / paramètres.


Vous pouvez configurer Maven pour utiliser un miroir pour le référentiel central, cela redirigera toutes les demandes qui iraient normalement au centre de votre référentiel interne.

Dans votre settings.xml, vous ajouteriez quelque chose comme ceci pour définir votre référentiel interne en tant que miroir pour central:

<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 référentiel proxy pour proxy central, de sorte que toutes les demandes qui seraient normalement envoyées à Central sont plutôt envoyées à votre référentiel proxy (ou à un groupe de référentiels 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 du central qui se trouve déjà sur le référentiel proxy.


Une solution plus basique si vous travaillez uniquement avec des référentiels locaux est de définir la politique de mise à jour pour le référentiel central sur "jamais", cela signifie que Maven ne vérifiera que les artefacts qui ne sont pas déjà dans le référentiel local. Cela peut ensuite être remplacé sur la ligne de commande si nécessaire en utilisant le commutateur -U pour forcer Maven à vérifier les mises à jour.

Vous configureriez le référentiel (dans votre pom ou un profil dans le settings.xml) comme suit:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
Vendeur riche
la source
Nous avons en fait déjà un référentiel central, mais bien sûr, nous ne publions pas de builds d'instantanés dessus, donc je suppose que j'obtiendrais toujours des vérifications de mise à jour échouées avec le proxy / miroir en place - je cherche un moyen d'obtenir Maven pour ne pas vérifier du tout les mises à jour pour ces artefacts.
Tim Gilbert
1
Cela vaut également la peine de configurer un référentiel logique sur votre référentiel central pour vos SNAPSHOTs. Cela signifie qu'ils peuvent être partagés entre vos développeurs et que vous n'avez pas tous à tous les construire localement. Vous bénéficierez alors pleinement des avantages des SNAPSHOTs en prenant les modifications apportées à toutes les dépendances de SNAPSHOT dès qu'elles sont poussées vers le référentiel distant.
Rich Seller
Merci - le drapeau updatePolicy ressemble exactement à ce que je recherchais.
Tim Gilbert
1
Nexus vous permet également de configurer des règles pour empêcher toute demande de transfert d'artefacts d'entreprise vers l'extérieur.
Brian Fox
L'extrait XML ici est désormais obsolète. L' updatePolicyélément passe sous l' élément snapshotsou releases. Voir: maven.apache.org/settings.html
Jeff Evans
5

Très simple :

Dans votre Super POM parent 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>

C'est mes conseils

Bruno Régnier
la source
0

J'ai eu un problème similaire à celui-ci,

<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>

La définition de updatePolicy sur "jamais" ne fonctionnait pas. La suppression de ces repo était la façon dont je l'ai résolu. ps: je suivais ce tutoriel sur les services web (btw, probablement le meilleur tutoriel pour ws pour java)

troisième
la source
1
Utilisez-vous Intellij? Parce que Intellij + Maven = ignore updatePolicy. Voir le rapport de bogue youtrack.jetbrains.com/issue/IDEA-76869
Manav