Lorsque maven dit "la résolution ne sera pas tentée à nouveau tant que l'intervalle de mise à jour de MyRepo ne sera pas écoulé", où cet intervalle est-il spécifié?

587

Avec maven, je frappe occasionnellement un artefact provenant d'un référentiel tiers que je n'ai pas encore construit ou inclus dans mon référentiel.

Je recevrai un message d'erreur du client maven disant qu'un artefact est introuvable:

Impossible de trouver org.jfrog.maven.annomojo: maven-plugin-anno: jar: 1.4.0 in a http://myrepo:80/artifactory/repoété mis en cache dans le référentiel local, la résolution ne sera pas tentée à nouveau tant que l'intervalle de mise à jour de MyRepo ne sera pas écoulé ou que les mises à jour ne seront pas forcées -> [ Aide 1]

Maintenant, je comprends ce que cela signifie, et -Uje peux simplement relancer ma commande , et les choses fonctionnent généralement bien à partir de là .

Cependant, je trouve ce message d'erreur extrêmement peu intuitif et j'essaie d'épargner à mes collègues des maux de tête.

J'essaie de comprendre s'il y a un endroit où je peux modifier ce update intervalparamètre.

  1. Le update intervalparamètre mentionné dans ce message d'erreur est-il un paramètre côté client ou côté serveur?
  2. Si côté client, comment le configurer?
  3. Si côté serveur, quelqu'un sait-il comment / si Nexus / Artifactory expose ces paramètres?
cprice404
la source
11
J'ai reçu le même message d'erreur après avoir ajouté 1 dépendance supplémentaire à mon pom.xml. Pour moi, c'est clairement un BUG. Je ne comprends pas pourquoi cela se produit! Si j'ajoute des dépendances à mon projet et que j'exécute la compilation mvn, il suffit de télécharger les fichiers jar. Ce comportement est totalement insensé!
Robert Reiz
J'ai récemment vécu cela et après toutes les réponses que j'ai lues, une autre étape supplémentaire consiste à réimporter le projet dans Eclipse (dans mon cas). C'était trop bizarre qu'Eclipse n'arrête pas de me mettre sur écoute avec un plugin qui n'est pas dans le mien pom.xml.
Incognito
Une question importante pour moi !! Merci mon pote!
M. Noddy
Pour moi, il s'est avéré qu'un dépôt particulier était lié à GitHub et que l'URL était hors ligne (obtenant 404). J'ai mis à jour le dépôt sur notre serveur interne et cela a fonctionné.
cbmeeks

Réponses:

286

J'avais l'habitude de résoudre ce problème en supprimant le répertoire d'artefacts correspondant qui n'a pas pu être téléchargé dans mon référentiel local. La prochaine fois que j'exécuterai la commande maven, le téléchargement d'artefact est à 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 en utilisant -U, comme vous l'avez déjà souligné.

Christian Achilli
la source
7
"J'utilise pour résoudre ce problème en supprimant le répertoire d'artefacts correspondant qui n'a pas pu être téléchargé dans mon référentiel local." Cela a fonctionné pour moi. J'utilise également Netbeans.
16
Si Maven note que l'artefact mis en cache n'est pas valide, pourquoi ne peut-il pas résoudre cela seul?
Stefan
1
que signifie «configurer une tâche planifiée» et «cela se fait en utilisant -U», pouvez-vous les mettre en termes objectifs de l'interface utilisateur Eclipse?
user2568374
1
Je suppose que vous voulez dire Eclipse IDE. La théorie est que vous devez télécharger le dernier INSTANTANÉ. Pour ce faire, vous devez ajouter le paramètre '-U' à votre commande maven, par exemple mvn clean compile -U. Maintenant, vous pouvez exécuter cette commande maven via la ligne de commande ou via Eclipse en cochant la case «Toujours mettre à jour l'instantané». Pas sûr, j'utilise intellij ces jours-ci. La partie «configuration d'une tâche planifiée» fait référence à une configuration particulière que vous souhaitez avoir sur votre serveur Nexus. Ce dernier n'a rien à voir avec Eclipse en tant que tel.
Christian Achilli
10
Cela ne répond pas à la question réelle des PO.
8bitjunkie
116

vous pouvez supprimer le répertoire d'artefacts ayant échoué correspondant dans votre référentiel local. Et vous pouvez également simplement utiliser le -Udans le but. Il fera le travail. Cela fonctionne avec maven 3. Il n'est donc pas nécessaire de rétrograder vers maven 2.

kds
la source
2
Pourquoi jouer avec la configuration du référentiel alors que cela peut être aussi simple?
Koraktor
9
Veuillez lire attentivement la question avant de répondre. OP demande comment définir l'intervalle de temps, pas comment forcer une mise à jour.
i3ensays
2
Pas une réponse à la question, mais c'est ce dont les gens ont besoin lorsqu'ils frappent cette exception. Parce que lorsque vous travaillez sur un développement de lib local, le mieux est de supprimer une telle lib au lieu de laisser l'intervalle vous dérouter.
mcvkr
Nous devrions avoir des référentiels valides ajoutés sous ~/.m2/settings.xml/<repositories>pour résoudre ce problème avec les options -U
Kanagavelu Sugumar
64

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 obtenais le même "... a été mis en cache dans le référentiel local, la résolution ne sera pas tentée à nouveau tant que l'intervalle de mise à jour de Nexus ne sera pas écoulé ou que les mises à jour ne seront pas 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>
MrDrews
la source
8
N'a pas aidé dans mon cas.
arcy
64

Ce qui se passe essentiellement est que, selon la politique de mise à jour par défaut de maven, Maven récupère quotidiennement les pots du repo.

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

Sanjeev Guglani
la source
39

Selon la référence des paramètres :

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 de métadonnées maven d'un référentiel) à la télécommande. Les choix sont: 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>
Raghuram
la source
7
Merci pour la réponse; cependant, j'ai expérimenté un peu avec le paramètre "updatePolicy", et il semble n'avoir aucun effet sur l'erreur "Not Found" / "Failure Cached" / "la résolution ne sera pas tentée à nouveau".
cprice404
23

Bien que vous puissiez résoudre ce problème avec une installation propre (en remplaçant toutes les dépendances mises en cache) comme le suggère @ Sanjeev-Gulgani avec mvn -U clean install

Vous pouvez également simplement supprimer la dépendance mise en cache qui cause le problème avec

mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"

Voir les documents mvn pour plus d'informations.

sfletche
la source
9

Cette erreur peut parfois être trompeuse. 2 choses à vérifier:

  1. Existe-t-il un fichier JAR réel pour la dépendance dans le référentiel? Votre message d'erreur contient une URL de l'endroit où il recherche, alors allez-y, puis accédez au dossier qui correspond à votre dépendance. Y a-t-il un pot? Sinon, vous devez modifier votre dépendance. (par exemple, vous pourriez pointer vers une dépendance parent de niveau supérieur, alors que vous devriez pointer vers un sous-projet)

  2. Si le bocal existe sur le référentiel distant, supprimez simplement votre copie locale. Il sera dans votre répertoire personnel (sauf si vous avez configuré différemment) sous .m2 / repository (ls -a pour montrer caché si sous Linux).

MattC
la source
4
Cela n'est pas pertinent pour la question de OP. La raison pour laquelle l'erreur est affichée n'est pas le point. OP veut savoir comment définir l'intervalle de nouvelle tentative.
8bitjunkie
1
Cela peut être un problème implicite derrière le poste d'OP et s'est avéré être mon problème. Il s'est avéré que j'avais une faute de frappe dans mon <groupId> qui, en examinant l'option 1, m'a conduit sur la bonne voie.
James Oravec
1
La question est de savoir comment définir l'intervalle?
smilyface
7

Si vous utilisez Eclipse, accédez à Windows -> Préférences -> Maven et décochez la case "Ne pas mettre à jour automatiquement les dépendances des référentiels distants".

Cela fonctionne également avec Maven 3.

ashoka
la source
1
vérifié pour: eclipse: Juno Service Release 2. m2e: v 1.3.1
user77115
8
Cela ne répond pas à la question d'OP.
8bitjunkie
5

Vous devez supprimer tous les fichiers "_maven.repositories" de votre référentiel.

Riadh
la source
3
n'aide pas, ou du moins pas dans mon cas
arcy
1
Ça a marché pour moi. Je ne les ai pas tous supprimés, cependant, seulement celui dans ce dossier de dépendance spécifique
Piyin
5

Cela fonctionne après avoir supprimé la dépendance associée de votre référentiel maven local

/user/.m2/repository/path
Pravin
la source
Cela fonctionne comme un charme
Jadda
3

Si vous utilisez Nexus comme référentiel proxy, il a le paramètre "Cache TTL non trouvé" 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 la documentation pour plus d'informations.

chipiik
la source
2

Comment j'ai eu ce problème,

Lorsque je suis passé d'Eclipse Juno à Luna et que j'ai extrait mes projets maven du repo 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 à nouveau en utilisant 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 attendre que la réindexation se produise.

C'est tout, le problème est résolu.

Lyju I Edwinson
la source
4
Cela ne répond pas à la question d'OP.
8bitjunkie
2

Pour enfin répondre à la question du titre: C'est (un paramètre côté client) dans (projet, profil ou paramètres)

[plugin]?[r|R]epository/[releases|snapshots]/updatePolicy

... tag.

Les valeurs possibles (actuellement maven: 3.6.0, mais je suppose qu'elles sont compatibles "loin 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 (maven 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ù lastModifiedest (fichier local) "l'horodatage modifié" d'un / chaque artefact sous-jacent.


En particulier pour le interval:xcadre:

  • le côlon :est pas stricte - tout caractère « non vide » pourrait le faire ( =, , ...).
  • les valeurs négatives x < 0devraient donner «jamais».
  • interval:0 Je suppose un intervalle "minutieux" (0-59 secondes ou plus ...).
  • les exceptions de format numérique entraînent des 24 * 60minutes (~ "quotidiennement").

..voir: DefaultUpdatePolicyAnalyzer , DefaultMetadataResolver # resolverMetadata () et RepositoryPolicy

xerx593
la source
1

Pour Intellij utilisateurs d' , les éléments suivants ont fonctionné pour moi:

Clic droit sur votre colis

Maven > Reimport 

et

Maven > Generate Sources and Update Folders
Emerica
la source
0

Un peu pertinent .. je devenais

"[ERREUR] Échec de l'exécution de l'objectif sur le projet testproject: impossible de résoudre les dépendances du projet myjarname: jar: 1.0-0: échec de la recherche de myjarname-core: bundle: 1.0-0 in a http://repo1.maven.org/maven2été mis en cache dans le référentiel local, la résolution ne sera pas réessayé jusqu'à ce que l'intervalle de mise à jour de central soit écoulé ou que les mises à jour soient forcées -> [Aide 1] "

Cette erreur a été provoquée par une utilisation accidentelle Maven 3au lieu de Maven 2. Je pensais juste que cela pourrait faire gagner du temps à quelqu'un, car ma recherche initiale sur Google m'a conduit à cette page.

sdanzig
la source
2
Et si votre projet vous oblige à utiliser Maven 3? Avez-vous une idée de ce qui a changé entre les deux versions?
Xr.
1
C'est exactement mon problème. Je ne sais pas pourquoi Maven 3 est si différent de 2. Merci d'avoir posté ceci et de m'avoir épargné de perdre plus de temps à chercher une solution.
CatsAndCode
comment installer maven2 au lieu de maven3?
billions
Question très générique .. quel système d'exploitation? Pour Ubuntu, vous pouvez faire "sudo apt-get install maven2" ... ou pour tout Linux / UNIX, vous pouvez simplement télécharger l'archive et la compiler vous-même, en l'ajoutant à votre chemin. Essayez: shameerarathnayaka.blogspot.com/2012/01/…
sdanzig
Cela a fonctionné pour moi et en fait je renvoie à cela à partir de ma réponse ici .
shiri
0

Maven a des paramètres updatePolicy pour spécifier la fréquence de vérification des mises à jour dans le référentiel ou pour garder le référentiel synchronisé avec la télécommande.

  • La valeur par défaut de updatePolicy est quotidienne.
  • Les autres valeurs peuvent être toujours / jamais / XX (en spécifiant l'intervalle en minutes).

L'échantillon de code ci-dessous peut être ajouté au fichier de paramètres utilisateur maven pour configurer updatePolicy.

<pluginRepositories>
    <pluginRepository>
        <id>Releases</id>
        <url>http://<host>:<port>/nexus/content/repositories/releases/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>             
</pluginRepositories>
VYSAKHAN SREEKUMARAN KASTHURI
la source
3
Cela ne répond pas à la question d'OP. OP est clair qu'ils comprennent quel est le problème et comment mettre à jour leur référentiel m2 local. OP demande où se situe l'intervalle et comment le modifier. Il n'y a aucune mention d'IDE du tout. Vous n'avez pas lu la question.
8bitjunkie
@ 8bitjunkie Cela répond tout à fait directement la question: If client-side, how do I configure it?. Cette réponse ne concerne aucune fonctionnalité IDE. Il s'agit uniquement de la configuration du référentiel mvn. C'est updatePolicyl'intervalle que l'OP demande.
montrivo
Cela pourrait être la réponse acceptée @ cprice404.
montrivo
0

Dans mon cas, la solution était stupide: je venais d'avoir des versions de dépendance incorrectes.

Maria Pomazkina-Karpikova
la source
0

J'ai eu ce problème et les descriptions complètes proposées dans ce document m'ont aidé à le résoudre.

Le deuxième problème déclaré était mon problème. J'ai utilisé un référentiel tiers auquel je venais de l'ajouter pour faire la repositorypartie du fichier pom dans mon projet. J'ajoute les mêmes informations de référentiel dans pluginrepositorypour résoudre ce problème.

epcpu
la source
0

J'ai eu une erreur similaire avec un artefact différent.

<...> a été mis en cache dans le référentiel local, la résolution ne sera pas tentée à nouveau tant que l'intervalle de mise à jour du central ne sera pas écoulé ou que les mises à jour ne seront pas forcées

Aucune des solutions décrites ci-dessus n'a fonctionné pour moi. J'ai finalement résolu cela dans IntelliJ IDEA par Fichier> Invalider les caches / redémarrer ...> Invalider et redémarrer .

NoraT
la source
0

Dans mon cas, j'ai eu plusieurs projets

rootProject
 |-> contractProject (using Project Lombok)
 |-> domainProject (dependency on contractProject)

Quand j'ai fait "mvn clean install" à partir du répertoire "domainProject", j'obtenais cette erreur.

Lorsque j'ai fait "mvn clean install" à partir du répertoire "projectRoot", le problème a disparu.

ChetPrickles
la source