Avec maven, je rencontre parfois un artefact provenant d'un dépôt tiers que je n'ai pas encore construit ni inclus dans mon référentiel.
Je vais recevoir un message d'erreur du client maven disant qu'un artefact est introuvable:
Échec de la recherche de org.jfrog.maven.annomojo: maven-plugin-anno: jar: 1.4.0 dans
http://myrepo:80/artifactory/repo
ayant été mis en cache dans le référentiel local, la résolution ne sera pas tentée tant que l'intervalle de mise à jour de MyRepo n'aura pas été mis à jour. sont forcés -> [Aide 1]
Maintenant, I comprend ce que cela signifie, et peut simplement réexécuter ma commande avec -U
, et les choses en général fonctionne bien à partir de là.
Cependant, je trouve ce message d'erreur extrêmement peu intuitif et j'essaie d'éviter à mes collègues des maux de tête.
J'essaie de déterminer s'il y a un endroit où je peux modifier ce paramètre update interval
.
update interval
mentionné dans ce message d'erreur est-il un paramètre côté client ou côté serveur?J'avais l'habitude de résoudre ce problème en supprimant le répertoire d'échec de téléchargement correspondant dans mon dépôt local. La prochaine fois que j'exécuterai la commande maven, le téléchargement de l'artefact sera à nouveau déclenché. Par conséquent, je dirais que c'est un paramètre côté client.
Côté Nexus (côté repo du serveur), ce problème est résolu en configurant une tâche planifiée. Côté client, cela se fait avec -U
, comme vous l'avez déjà souligné.
vous pouvez supprimer le répertoire d'artefact défaillant correspondant dans votre référentiel local. Et vous pouvez aussi simplement utiliser le -U
dans le but. Cela fera le travail. Cela fonctionne avec maven 3. Donc, pas besoin de passer à maven 2.
J'ai eu un problème connexe, mais la réponse de Raghuram a aidé. (Je n'ai pas encore assez de réputation pour voter sa réponse). J'utilise Maven fourni avec NetBeans et le même "" a été mis en cache dans le référentiel local, la résolution ne sera pas tentée jusqu'à ce que l'intervalle de mise à jour de Nexus soit écoulé ou que les mises à jour soient forcées -> [Aide 1] " .
Pour résoudre ce problème, j'ai ajouté <updatePolicy>always</updatePolicy>
à mon fichier de paramètres (C:\Program Files\NetBeans 7.0\Java\maven\conf\settings.xml).
<profile>
<id>nexus</id>
<!--Enable snapshots for the built in central repo to direct -->
<!--all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
Selon la politique de mise à jour par défaut de maven.Maven ira chercher les pots tous les jours dans le dépôt. Ainsi, si lors de la première tentative, votre connexion Internet ne fonctionnait pas, elle n'essaierait pas d'aller chercher ce pot jusqu'à 24 heures.
Résolution:
Soit utiliser
mvn -U clean install
où -U forcera la mise à jour du référentiel
ou utiliser
<profiles>
<profile>
...
<repositories>
<repository>
<id>myRepo</id>
<name>My Repository</name>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
</repository>
</repositories>
...
</profile>
</profiles>
dans votre settings.xml
Selon les réglages référence :
updatePolicy: Cet élément spécifie la fréquence à laquelle les mises à jour doivent tenter de se produire. Maven comparera l’horodatage du POM local (stocké dans le fichier maven-métadonnées d’un référentiel) et celui-ci. Les choix sont les suivants: toujours, quotidien (par défaut), intervalle: X (où X est un entier en minutes) ou jamais
Exemple:
<profiles>
<profile>
...
<repositories>
<repository>
<id>myRepo</id>
<name>My Repository</name>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
</repository>
</repositories>
...
</profile>
</profiles>
...
</settings>
Cette erreur peut parfois être trompeuse. 2 choses à vérifier:
Existe-t-il un fichier JAR pour la dépendance dans le référentiel? Votre message d'erreur contient une URL indiquant l'emplacement de la recherche. Allez-y, puis naviguez jusqu'au dossier qui correspond à votre dépendance. Y a-t-il un pot? Sinon, vous devez changer votre dépendance. (par exemple, vous pouvez pointer sur une dépendance parentale de niveau supérieur, alors que vous devriez pointer sur un sous-projet)
Si le fichier JAR existe sur le référentiel distant, supprimez simplement votre copie locale. Ce sera dans votre répertoire personnel (à moins que vous n'ayez configuré différemment) sous .m2/repository (ls -a à afficher masqué si sous Linux).
Bien que vous puissiez résoudre ce problème avec une nouvelle installation (en remplaçant les dépendances mises en cache), comme @ Sanjeev-Gulgani le suggère avec mvn -U clean install
Vous pouvez également simplement supprimer la dépendance en cache à l'origine du problème avec
mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"
Voir mvn docs pour plus d'informations.
Si vous utilisez Eclipse, sélectionnez Windows -> Préférences -> Maven et décochez la case "Ne pas mettre à jour automatiquement les dépendances à partir de référentiels distants".
Cela fonctionne aussi avec Maven 3.
Vous devez supprimer tous les fichiers "_maven.repositories" de votre référentiel.
Si vous utilisez Nexus en tant que référentiel de proxy, il possède le paramètre "TTL Cache Introuvable" avec la valeur par défaut 1440 minutes (ou 24 heures). Réduire cette valeur peut aider (Référentiels> Configuration> Paramètres d'expiration).
Voir documentation pour plus d'informations.
Pour enfin répondre à la question du titre: C’est (paramètre côté client) dans (projet, profil ou paramètres)
[plugin]?[r|R]epository/[releases|snapshots]/updatePolicy
... tag.
Le (actuellement, maven: 3.6.0, mais je suppose que les valeurs compatibles "très en arrière") sont:
/** * Never update locally cached data. */ public static final String UPDATE_POLICY_NEVER = "never"; /** * Always update locally cached data. */ public static final String UPDATE_POLICY_ALWAYS = "always"; /** * Update locally cached data once a day. */ public static final String UPDATE_POLICY_DAILY = "daily"; /** * Update locally cached data **every X minutes** as given by "interval:X". */ public static final String UPDATE_POLICY_INTERVAL = "interval";
L'évaluation actuelle (version 3.6.0) de cette balise est implémentée comme suit:
public boolean isUpdatedRequired( RepositorySystemSession session, long lastModified, String policy ) { boolean checkForUpdates; if ( policy == null ) { policy = ""; } if ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) ) { checkForUpdates = true; } else if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) ) { Calendar cal = Calendar.getInstance(); cal.set( Calendar.HOUR_OF_DAY, 0 ); cal.set( Calendar.MINUTE, 0 ); cal.set( Calendar.SECOND, 0 ); cal.set( Calendar.MILLISECOND, 0 ); checkForUpdates = cal.getTimeInMillis() > lastModified; } else if ( policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) ) { int minutes = getMinutes( policy ); Calendar cal = Calendar.getInstance(); cal.add( Calendar.MINUTE, -minutes ); checkForUpdates = cal.getTimeInMillis() > lastModified; } else { // assume "never" checkForUpdates = false; if ( !RepositoryPolicy.UPDATE_POLICY_NEVER.equals( policy ) ) { LOGGER.warn( "Unknown repository update policy '{}', assuming '{}'", policy, RepositoryPolicy.UPDATE_POLICY_NEVER ); } } return checkForUpdates; }
..avec:
private int getMinutes( String policy ) { int minutes; try { String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 ); minutes = Integer.valueOf( s ); } catch ( RuntimeException e ) { minutes = 24 * 60; LOGGER.warn( "Non-parseable repository update policy '{}', assuming '{}:1440'", policy, RepositoryPolicy.UPDATE_POLICY_INTERVAL ); } return minutes; }
... où lastModified
est le "timestamp modifié" (fichier local) d'un/de chaque artefact sous-jacent.
En particulier pour le paramètre interval:x
:
:
ne sont pas si stricts - n'importe quel caractère "non vide" peut le faire (=
, ...).x < 0
devraient donner la valeur "jamais".interval:0
Je supposerais un intervalle "minutieux" (0-59 secondes ou plus ...).24 * 60
minutes (~ "quotidiennement")...see: (DefaultUpdatePolicyAnalyzer) , DefaultMetadataResolver # resolMetadata () et RepositoryPolicy
Cela fonctionne une fois que vous avez supprimé la dépendance associée de votre référentiel Maven local.
/user/.m2/repository/path
Comment j'ai eu ce problème,
Lorsque je suis passé d’Eclipse Juno à Luna et que j’ai récupéré mes projets maven dans le dépôt SVN, j’ai eu les mêmes problèmes lors de la création des applications.
Qu'est-ce que j'ai essayé? J'ai essayé de nettoyer le référentiel local puis de mettre à jour toutes les versions à l'aide de l'option -U. Mais mon problème a continué.
Ensuite, je suis allé dans Fenêtre -> Préférences -> Maven -> Paramètres utilisateur -> et j'ai cliqué sur le bouton Réindexer sous Référentiel local et ai attendu que la réindexation se produise.
C'est tout, le problème est résolu.
Quelque peu pertinent .. Je devenais
"[ERREUR] Echec de l'exécution de l'objectif sur le projet testproject: Impossible de résoudre les dépendances du projet nom_jar: jar: 1.0-0: Echec de la recherche du nom_jar: noyau: bundle: 1.0-0 dans
http://repo1.maven.org/maven2
a été mis en cache dans le référentiel local. , la résolution ne sera pas tentée tant que l'intervalle de mise à jour de la centrale ne sera pas écoulé ou que les mises à jour ne seront forcées -> [Help 1] "
Cette erreur est due à l'utilisation accidentelle de Maven 3
au lieu de Maven 2
. J'ai juste pensé que cela pourrait faire gagner du temps à quelqu'un, car ma recherche initiale sur Google m'a conduit à cette page.