Je travaille sur un assez gros 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 une dizaine d'applications qui les utilisent. Tous ces éléments résident dans l’espace de noms com.mycompany.*
.
La plupart du temps, nous travaillons contre des versions d'instantané. Donc, pour créer une application complète, je pourrais d’abord compiler les projets de bibliothèque de manière à ce 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 souhaite 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.jar
artefacts. Bien sûr, ils ne sont pas trouvés là-bas, et tout résout finalement dans les versions que je viens de compiler dans mon référentiel local, mais j'aimerais que Maven arrête de le faire car (a) cela me donne l'impression d'être un mauvais net.citizen 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 gênante dans mon processus de construction.
J'ai commencé à exécuter maven en mode hors connexion la plupart du temps, mais ce n'est pas idéal, car une dépendance à une bibliothèque publique est parfois mise à jour. Donc, ce que je recherche, c’est une solution qui permettra à Maven de ne pas rechercher les mises à jour de référentiels 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 qui étaient dans le com.mycompany
espace de noms.
La balise updatePolicy n'a pas fonctionné pour moi. Cependant, Rich Seller a mentionné que les instantanés devraient de toute façon être désactivés. J'ai donc cherché plus loin et remarqué que le référentiel supplémentaire que j'avais ajouté à mon fichier settings.xml était à l'origine du problème. L'ajout de la section des instantanés à ce référentiel dans mon fichier 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>
En outre, vous pouvez utiliser -o
ou --offline
dans la ligne de commande mvn qui mettra maven en "mode hors connexion" afin de ne pas rechercher les mises à jour. Vous recevrez un avertissement sur le fait de ne pas pouvoir obtenir de dépendances qui ne figurent pas déjà dans votre dépôt local, mais ce n'est pas grave.
Quelque chose qui est maintenant disponible dans maven est aussi
mvn goal --no-snapshot-updates
ou en bref
mvn goal -nsu
Mise à jour: J'aurais probablement dû commencer avec ceci car vos projets sont SNAPSHOT. Cela fait partie de la sémantique SNAPSHOT que Maven vérifie les mises à jour de chaque construction. Être un SNAPSHOT signifie qu'il est volatil et sujet à changement, il faut donc vérifier les mises à jour. Toutefois, il est intéressant de noter que Maven super POM configure le système pour désactiver les instantanés. Maven ne devrait donc jamais rechercher de mises à jour de SNAPSHOT sur le serveur central, à moins que vous ne l'ayez modifié dans vos propres 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 fichier settings.xml, vous ajouteriez quelque chose comme ceci pour définir votre référentiel interne comme miroir pour le fichier 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 tel que Nexus pour votre référentiel interne. Vous pouvez configurer un référentiel proxy pour le proxy central. Ainsi, toutes les demandes qui iraient normalement au centre sont 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 du proxy sur -1, afin qu'il ne demande jamais de contenu provenant du fichier central déjà présent dans le référentiel du proxy.
Une solution plus simple si vous travaillez uniquement avec des référentiels locaux consiste à définir "jamais" updatePolicy pour le référentiel central, ce qui signifie que Maven ne fera que jamais. recherchez des artefacts qui ne figurent pas déjà dans le référentiel local. Cela peut ensuite être remplacé en cas de besoin sur la ligne de commande en utilisant le commutateur -U pour forcer Maven à rechercher les mises à jour.
Vous devez configurer le référentiel (dans votre pom ou un profil dans le fichier settings.xml) comme suit:
<repository>
<id>central</id>
<url>http://repo1.maven.org/maven2</url>
<updatePolicy>never</updatePolicy>
</repository>
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
J'ai eu des problèmes similaires à 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 "jamais" de la politique de mise à jour ne fonctionnait pas. La suppression de ces pensions était la façon dont je l'ai résolu. ps: je suivais ceci tutoriel à propos des services Web (au fait, probablement le meilleur tutoriel pour ws pour Java)