Wenn maven sagt, dass die Auflösung erst nach Ablauf des Aktualisierungsintervalls von MyRepo erneut versucht wird, wo wird dieses Intervall angegeben?

587

Mit maven stoße ich gelegentlich auf ein Artefakt, das aus einem Repo eines Drittanbieters stammt, das ich noch nicht erstellt oder in mein Repository aufgenommen habe.

Ich erhalte eine Fehlermeldung vom Maven-Client, dass ein Artefakt nicht gefunden werden kann:

Wenn org.jfrog.maven.annomojo: maven-plugin-anno: jar: 1.4.0 in nicht gefunden wurde, http://myrepo:80/artifactory/repowurde es im lokalen Repository zwischengespeichert. Die Auflösung wird erst erneut versucht, wenn das Aktualisierungsintervall von MyRepo abgelaufen ist oder Aktualisierungen erzwungen werden -> [ Hilfe 1]

Jetzt verstehe ich , was dies bedeutet, und kann meinen Befehl einfach erneut ausführen -U, und von da an funktionieren die Dinge normalerweise einwandfrei .

Ich finde diese Fehlermeldung jedoch äußerst unintuitiv und versuche, meinen Mitarbeitern einige Kopfschmerzen zu ersparen.

Ich versuche herauszufinden, ob es einen Ort gibt, an dem ich diese update intervalEinstellung ändern kann .

  1. Handelt es sich bei der update intervalin dieser Fehlermeldung genannten Einstellung um eine clientseitige oder serverseitige Einstellung?
  2. Wie konfiguriere ich es auf der Clientseite?
  3. Weiß jemand auf der Serverseite, wie / ob Nexus / Artifactory diese Einstellungen verfügbar macht?
cprice404
quelle
11
Ich habe die gleiche Fehlermeldung erhalten, nachdem ich meiner pom.xml 1 weitere Abhängigkeit hinzugefügt habe. Für mich ist dies eindeutig ein Fehler. Ich verstehe nicht, warum das passiert! Wenn ich meinem Projekt Abhängigkeiten hinzufüge und mvn compile ausführe, sollte es nur die JAR-Dateien herunterladen. Dieses Verhalten ist totaler Unsinn!
Robert Reiz
Ich habe dies erst kürzlich erlebt und nach all den Antworten, die ich gelesen habe, besteht ein weiterer zusätzlicher Schritt darin, das Projekt (in meinem Fall) erneut in Eclipse zu importieren . Es war zu seltsam, dass Eclipse mich immer wieder mit einem Plugin nervte, das nicht in meinem ist pom.xml.
Inkognito
Eine wichtige Frage für mich !! Danke Kumpel!
Mr. Noddy
Für mich stellte sich heraus, dass ein bestimmtes Repo mit GitHub verknüpft war und die URL offline ging (404). Ich habe das Repo auf unseren internen Server aktualisiert und es hat funktioniert.
cbmeeks

Antworten:

286

Ich habe dieses Problem gelöst, indem ich das entsprechende Verzeichnis zum Herunterladen von Artefakten in meinem lokalen Repo gelöscht habe. Wenn ich das nächste Mal den Befehl maven ausführe, wird der Artefakt-Download erneut ausgelöst. Daher würde ich sagen, dass es sich um eine clientseitige Einstellung handelt.

Auf der Nexus-Seite (Server-Repo-Seite) ist dieses Problem beim Konfigurieren einer geplanten Aufgabe behoben. Auf der Clientseite erfolgt dies -U, wie Sie bereits betont haben.

Christian Achilli
quelle
7
"Ich verwende dieses Problem, indem ich das entsprechende Verzeichnis zum Herunterladen von Artefakten in meinem lokalen Repo lösche." Das hat bei mir funktioniert. Ich benutze auch Netbeans.
16
Wenn Maven feststellt, dass das zwischengespeicherte Artefakt ungültig ist, warum kann es dies nicht alleine lösen?
Stefan
1
Was bedeutet "Konfigurieren einer geplanten Aufgabe" und "Dies erfolgt mit -U". Können Sie diese bitte in objektive Eclipse-UI-Begriffe einfügen?
user2568374
1
Ich nehme an, Sie meinen Eclipse IDE. Die Theorie ist, dass Sie den neuesten SNAPSHOT herunterladen müssen. Dazu müssen Sie Ihrem maven-Befehl den Parameter '-U' hinzufügen, z. B. mvn clean compile -U. Jetzt können Sie diesen Maven-Befehl entweder über die Befehlszeile oder über Eclipse ausführen, indem Sie das Kontrollkästchen "Snapshot immer aktualisieren" aktivieren. Ich bin mir nicht sicher, ob ich heutzutage Intellij benutze. Der Teil "Konfigurieren einer geplanten Aufgabe" bezieht sich auf eine bestimmte Konfiguration, die Sie auf Ihrem Nexus-Server haben möchten. Letzteres hat nichts mit Eclipse als solchem ​​zu tun.
Christian Achilli
10
Dies beantwortet nicht die eigentliche Frage des OP.
8bitjunkie
116

Sie können das entsprechende fehlerhafte Artefaktverzeichnis in Ihrem lokalen Repository löschen. Und auch Sie können einfach das -Uim Ziel verwenden. Es wird die Arbeit machen. Dies funktioniert mit Maven 3. Sie müssen also kein Downgrade auf Maven 2 durchführen.

kds
quelle
2
Warum mit der Repository-Konfiguration herumspielen, wenn es so einfach sein kann?
Koraktor
9
Bitte lesen Sie die Frage sorgfältig durch, bevor Sie sie beantworten. OP fragt, wie das Zeitintervall eingestellt werden soll und nicht, wie ein Update erzwungen werden soll.
i3ensays
2
Keine Antwort auf die Frage, aber genau das brauchen die Leute, wenn sie diese Ausnahme treffen. Denn wenn Sie an einer lokalen Lib-Entwicklung arbeiten, ist es am besten, eine solche Lib zu löschen, anstatt sich durch das Intervall verwirren zu lassen.
mcvkr
Wir sollten gültige Repositorys unter haben ~/.m2/settings.xml/<repositories>, um dieses Problem mit -U-Optionen zu beheben
Kanagavelu Sugumar
64

Ich hatte ein ähnliches Problem, aber Raghurams Antwort half. (Ich habe noch nicht genug Ruf, um seine Antwort abzustimmen). Ich verwende Maven, das mit NetBeans gebündelt ist, und habe den gleichen Fehler "... wurde im lokalen Repository zwischengespeichert, die Auflösung wird nicht erneut versucht, bis das Aktualisierungsintervall von nexus abgelaufen ist oder Aktualisierungen erzwungen werden -> [Hilfe 1]" erhalten .

Um dies zu beheben, habe ich hinzugefügt <updatePolicy>always</updatePolicy> meine Einstellungsdatei (C: \ Programme \ 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
quelle
8
Hat in meinem Fall nicht geholfen.
Arcy
64

Was im Grunde passiert, ist, dass laut Standard-UpdatePolicy von maven.Maven die Gläser täglich aus dem Repo abruft. Wenn Ihr Internet beim ersten Versuch nicht funktioniert hat, würde es nicht versuchen, dieses Glas bis zu 24 Stunden erneut abzurufen.

Auflösung :

Entweder verwenden

mvn -U clean install

Dabei erzwingt -U die Aktualisierung des Repos

oder verwenden

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

in Ihrer settings.xml

Sanjeev Guglani
quelle
39

Gemäß den Einstellungen Referenz :

updatePolicy: Dieses Element gibt an, wie oft Aktualisierungen versucht werden sollen. Maven vergleicht den Zeitstempel des lokalen POM (der in der Maven-Metadatendatei eines Repositorys gespeichert ist) mit der Fernbedienung. Die Auswahlmöglichkeiten sind: immer, täglich (Standard), Intervall: X (wobei X eine Ganzzahl in Minuten ist) oder nie.

Beispiel:

<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
quelle
7
Danke für die Antwort; Ich habe jedoch ziemlich viel mit der Einstellung "updatePolicy" experimentiert, und es scheint keine Auswirkung auf den Fehler "Nicht gefunden" / "Fehler zwischengespeichert" / "Auflösung wird nicht erneut versucht" zu haben.
Preis 404
23

Sie können dies zwar mit einer Neuinstallation beheben (wobei alle zwischengespeicherten Abhängigkeiten überschrieben werden), wie @ Sanjeev-Gulgani mit vorschlägt mvn -U clean install

Sie können auch einfach die zwischengespeicherte Abhängigkeit entfernen, mit der das Problem verursacht wird

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

Weitere Informationen finden Sie in den MVN-Dokumenten .

sfletche
quelle
9

Dieser Fehler kann manchmal irreführend sein. 2 Dinge, die Sie überprüfen möchten:

  1. Gibt es eine tatsächliche JAR für die Abhängigkeit im Repo? Ihre Fehlermeldung enthält eine URL, nach der gesucht wird. Gehen Sie also dorthin und navigieren Sie zu dem Ordner, der Ihrer Abhängigkeit entspricht. Gibt es ein Glas? Wenn nicht, müssen Sie Ihre Abhängigkeit ändern. (Sie könnten beispielsweise auf eine übergeordnete Abhängigkeit der obersten Ebene zeigen, wenn Sie auf ein Unterprojekt zeigen sollten.)

  2. Wenn das Glas auf dem Remote-Repo vorhanden ist, löschen Sie einfach Ihre lokale Kopie. Es befindet sich in Ihrem Home-Verzeichnis (sofern Sie es nicht anders konfiguriert haben) unter .m2 / repository (ls -a wird unter Linux ausgeblendet angezeigt).

MattC
quelle
4
Dies ist für die Frage von OP nicht relevant. Der Grund, warum der Fehler angezeigt wird, ist nicht der Punkt. OP möchte wissen, wie das Wiederholungsintervall eingestellt wird.
8bitjunkie
1
Dies könnte ein implizites Problem hinter dem Beitrag von OP sein und sich als mein Problem herausstellen. Es stellte sich heraus, dass ich in meiner <groupId> einen Tippfehler hatte, der mich durch Überprüfen der Option 1 auf den richtigen Weg führte.
James Oravec
1
Die Frage ist, wie man das Intervall einstellt.
Smilyface
7

Wenn Sie Eclipse verwenden, gehen Sie zu Windows -> Einstellungen -> Maven und deaktivieren Sie das Kontrollkästchen "Abhängigkeiten von Remote-Repositorys nicht automatisch aktualisieren".

Dies funktioniert auch mit Maven 3.

Ashoka
quelle
1
verifiziert für: Eclipse: Juno Service Release 2. m2e: v 1.3.1
user77115
8
Dies beantwortet die Frage von OP nicht.
8bitjunkie
5

Sie müssen alle "_maven.repositories" -Dateien aus Ihrem Repository löschen.

Riadh
quelle
3
hilft nicht oder zumindest nicht in meinem Fall
Arcy
1
Es hat bei mir funktioniert. Ich habe sie jedoch nicht alle gelöscht, nur die in diesem bestimmten Abhängigkeitsordner
Piyin
5

Dies funktioniert, nachdem Sie die zugehörige Abhängigkeit aus Ihrem lokalen Maven-Repository gelöscht haben

/user/.m2/repository/path
Pravin
quelle
Das funktioniert wie ein Zauber
Jadda
3

Wenn Sie Nexus als Proxy-Repo verwenden, hat es die Einstellung "Nicht gefundener Cache TTL" mit dem Standardwert 1440 Minuten (oder 24 Stunden). Das Verringern dieses Werts kann hilfreich sein (Repositorys> Konfiguration> Ablaufeinstellungen).

Weitere Informationen finden Sie in der Dokumentation .

Chipiik
quelle
2

Wie ich zu diesem Problem kam,

Als ich von Eclipse Juno zu Luna wechselte und meine Maven-Projekte von SVN Repo aus überprüfte, traten beim Erstellen der Anwendungen dieselben Probleme auf.

Was habe ich versucht? Ich habe versucht, das lokale Repository zu bereinigen und dann alle Versionen erneut mit der Option -U zu aktualisieren. Aber mein Problem ging weiter.

Dann ging ich zu Fenster -> Einstellungen -> Maven -> Benutzereinstellungen -> und klickte auf die Schaltfläche Neu indizieren unter Lokales Repository und wartete, bis die Neuindizierung erfolgte.

Das ist alles, das Problem ist behoben.

Lyju ich Edwinson
quelle
4
Dies beantwortet die Frage von OP nicht.
8bitjunkie
2

Um die Titelfrage endgültig zu beantworten: Sie befindet sich (eine clientseitige Einstellung) in (Projekt, Profil oder Einstellungen).

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

... Etikett.

Die (derzeit maven: 3.6.0, aber ich nehme an, "weit rückwärts" kompatibel) möglichen Werte sind:

/**
 * 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";

Die aktuelle (maven 3.6.0) Auswertung dieses Tags wird wie folgt implementiert:

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

..mit:

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

... wo lastModifiedist der "geänderte Zeitstempel" der (lokalen Datei) eines / jedes zugrunde liegenden Artefakts?


Insbesondere für die interval:xEinstellung:

  • Der Doppelpunkt :ist nicht so streng - jedes "nicht leere" Zeichen könnte es tun ( =, , ...).
  • negative Werte x < 0sollten "nie" ergeben.
  • interval:0 Ich würde ein "minutiöses" Intervall (0-59 Sekunden oder mehr ...) annehmen.
  • Ausnahmen im Zahlenformat führen zu 24 * 60Minuten (~ "täglich").

..siehe: DefaultUpdatePolicyAnalyzer , DefaultMetadataResolver # resolveMetadata () und RepositoryPolicy

xerx593
quelle
1

Für Intellij- Benutzer hat Folgendes für mich funktioniert:

Klicken Sie mit der rechten Maustaste auf Ihr Paket

Maven > Reimport 

und

Maven > Generate Sources and Update Folders
Emerica
quelle
0

Etwas relevant. Ich wurde

"[FEHLER] Fehler beim Ausführen des Ziels für das Projekttestprojekt: Abhängigkeiten für das Projekt myjarname konnten nicht aufgelöst werden: jar: 1.0-0: Fehler beim Auffinden von myjarname-core: bundle: 1.0-0 in http://repo1.maven.org/maven2wurde im lokalen Repository zwischengespeichert, die Auflösung ist nicht möglich erneut versucht, bis das Aktualisierungsintervall von Central abgelaufen ist oder Aktualisierungen erzwungen werden -> [Hilfe 1] "

Dieser Fehler wurde durch versehentliche Verwendung von Maven 3anstelle von verursacht Maven 2. Ich dachte nur, es könnte jemandem Zeit sparen, weil meine erste Google-Suche mich zu dieser Seite führte.

sdanzig
quelle
2
Was ist, wenn Ihr Projekt Sie zwingt, Maven 3 zu verwenden? Haben Sie eine Ahnung, was sich zwischen den beiden Versionen geändert hat?
Xr.
1
Genau das war mein Problem. Keine Ahnung, warum Maven 3 so anders ist als 2. Vielen Dank, dass Sie dies gepostet haben und mir erspart haben, mehr Zeit mit der Suche nach einer Lösung zu verschwenden.
CatsAndCode
Wie installiere ich maven2 anstelle von maven3?
Billionen
Sehr allgemeine Frage .. welches Betriebssystem? Für Ubuntu können Sie "sudo apt-get install maven2" ausführen ... oder für Linux / UNIX können Sie das Archiv einfach herunterladen und selbst kompilieren und Ihrem Pfad hinzufügen. Versuchen Sie: shiterarathnayaka.blogspot.com/2012/01/…
sdanzig
Das hat bei mir funktioniert und tatsächlich verlinke ich von meiner Antwort hier darauf zurück .
Shiri
0

Maven verfügt über updatePolicy- Einstellungen zum Festlegen der Häufigkeit, mit der die Aktualisierungen im Repository überprüft oder das Repository mit Remote synchronisiert werden soll.

  • Der Standardwert für updatePolicy ist täglich.
  • Andere Werte können immer / nie / XX sein (Intervall in Minuten angeben).

Das folgende Codebeispiel kann zur Maven-Benutzereinstellungsdatei hinzugefügt werden, um updatePolicy zu konfigurieren.

<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
quelle
3
Dies beantwortet die Frage von OP nicht. OP ist klar, dass sie verstehen, wo das Problem liegt und wie sie ihr lokales m2-Repository aktualisieren können. OP fragt, wo sich das Intervall befindet und wie es geändert werden kann. Es wird überhaupt keine IDE erwähnt. Sie haben die Frage nicht gelesen.
8bitjunkie
@ 8bitjunkie Dies beantwortet ganz direkt die Frage : If client-side, how do I configure it?. Bei dieser Antwort handelt es sich nicht um eine IDE-Funktion. Es ist nur MVN-Repository-Konfiguration. Dies updatePolicyist das Intervall, nach dem das OP fragt.
Montrivo
Dies könnte die akzeptierte Antwort @ cprice404 sein.
Montrivo
0

In meinem Fall war die Lösung dumm: Ich hatte nur falsche Abhängigkeitsversionen.

Maria Pomazkina-Karpikova
quelle
0

Ich hatte dieses Problem und die umfassenden Beschreibungen in vorgeschlagenen diese half mir , es zu beheben.

Das zweite erklärte Problem war mein Problem. Ich habe ein Repository eines Drittanbieters verwendet, das ich gerade hinzugefügt habe, um den repositoryTeil der POM-Datei in meinem Projekt zu erledigen . Ich füge die gleichen Repository-Informationen hinzu pluginrepository, um dieses Problem zu beheben.

epcpu
quelle
0

Ich hatte einen ähnlichen Fehler mit einem anderen Artefakt.

<...> wurde im lokalen Repository zwischengespeichert. Die Auflösung wird erst erneut versucht, wenn das Aktualisierungsintervall von Central abgelaufen ist oder Aktualisierungen erzwungen werden

Keine der oben beschriebenen Lösungen hat bei mir funktioniert. Ich habe dies schließlich in IntelliJ IDEA durch Datei> Caches ungültig machen / Neustart ...> Ungültig machen und neu starten behoben .

NoraT
quelle
0

In meinem Fall hatte ich mehrere Projekte

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

Wenn ich "mvn clean install" aus dem Verzeichnis "domainProject" ausgeführt habe, wird der Fehler angezeigt.

Als ich "mvn clean install" aus dem Verzeichnis "projectRoot" ausgeführt habe, ist das Problem behoben.

ChetPrickles
quelle