826 Stimmen

Wenn maven sagt "Auflösung wird nicht erneut versucht, bis das Aktualisierungsintervall von MyRepo abgelaufen ist", wo ist dieses Intervall angegeben?

Mit Maven stoße ich gelegentlich auf ein Artefakt, das von einem Drittanbieter-Repository stammt, das ich noch nicht gebaut oder in mein Repository aufgenommen habe.

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

org.jfrog.maven.annomojo:maven-plugin-anno:jar:1.4.0 wurde nicht gefunden in http://myrepo:80/artifactory/repo wurde im lokalen Cache Repository zwischengespeichert wurde, wird die Auflösung nicht erneut versucht, bis das Aktualisierungs Intervall von MyRepo verstrichen ist oder Aktualisierungen erzwungen werden -> [Hilfe 1]

Jetzt, I verstehen, was das bedeutet, und kann meinen Befehl einfach erneut ausführen mit -U und von da an funktioniert es normalerweise gut. .

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

Ich versuche herauszufinden, ob es eine Stelle gibt, an der ich das ändern kann update interval Umgebung.

  1. Ist die update interval die in dieser Fehlermeldung erwähnt wird, eine clientseitige oder eine serverseitige Einstellung?
  2. Wenn clientseitig, wie konfiguriere ich es?
  3. Wenn Server-seitig, weiß jemand, wie/ob Nexus/Artifactory diese Einstellungen offenlegen?

42 Stimmen

Ich erhielt die gleiche Fehlermeldung nach dem Hinzufügen von 1 weiteren Abhängigkeit zu meiner pom.xml. Für mich ist das eindeutig ein BUG. Ich verstehe nicht, warum das passiert! Wenn ich Abhängigkeiten zu meinem Projekt hinzufüge und mvn compile ausführe, dann sollte es einfach die Jar-Dateien herunterladen. Dieses Verhalten ist völlig unsinnig!

3 Stimmen

2 Stimmen

Ich habe erst kürzlich diese Erfahrung gemacht, und nach all den Antworten, die ich gelesen habe, ist ein weiterer zusätzlicher Schritt das Projekt erneut importieren in Eclipse (in meinem Fall). Es war zu seltsam, dass Eclipse mich ständig mit einem Plugin nervte, das nicht in meinem pom.xml .

6voto

NoraT Punkte 71

Ich hatte einen ähnlichen Fehler mit einem anderen Artefakt.

<...> im lokalen Repository zwischengespeichert wurde, wird die Auflösung nicht erneut versucht bis das zentrale Aktualisierungsintervall verstrichen ist oder Aktualisierungen erzwungen werden

Keine der oben beschriebenen Lösungen hat bei mir funktioniert. Ich habe das Problem schließlich gelöst durch IntelliJ IDEA von Datei > Caches ungültig machen / neu starten ... > Ungültig machen und neu starten .

4voto

Emeric Punkte 4985

Für Intellij Nutzern hat das Folgende bei mir funktioniert:

Rechtsklick auf Ihr Paket

Maven > Reimport 

y

Maven > Generate Sources and Update Folders

3voto

chipiik Punkte 1824

Wenn Sie Nexus als Proxy-Repositorium verwenden, verfügt es über eine "Not Found Cache TTL"-Einstellung mit dem Standardwert 1440 Minuten (oder 24 Stunden). Eine Verringerung dieses Wertes kann helfen (Repositories > Configuration > Expiration Settings).

Siehe Dokumentation für weitere Informationen.

3voto

Vysakhan Kasthuri Punkte 495

Maven hat updatePolicy Einstellungen für die Häufigkeit der Überprüfung der Aktualisierungen im Repository oder für die Synchronisierung des Repositorys mit Remote.

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

Das folgende Code-Beispiel kann der 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>

3 Stimmen

Dies ist keine Antwort auf die Frage des Auftraggebers. OP ist klar, dass er das Problem verstanden hat und weiß, wie er sein lokales m2-Repository aktualisieren kann. OP fragt, wo sich das Intervall befindet und wie man es ändern kann. Von einer IDE ist überhaupt nicht die Rede. Sie haben die Frage nicht gelesen.

1 Stimmen

@8bitjunkie Das beantwortet ganz direkt die Frage: If client-side, how do I configure it? . In dieser Antwort geht es nicht um eine IDE-Funktion. Es geht nur um die Repository-Konfiguration von mvn. Die updatePolicy ist das Intervall, nach dem der Auftraggeber fragt.

3voto

xerx593 Punkte 8902

Um abschließend die Titelfrage zu beantworten: Es ist (eine clientseitige Einstellung) in (Projekt, Profil oder Einstellungen)

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

... Tag.

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 ist 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 lastModified ist der (lokale Datei-) "Änderungszeitstempel" eines/jeder zugrunde liegenden Artefakts.


Insbesondere für die interval:x Umgebung:

  • der Dickdarm : ist nicht so streng - jedes "nicht leere" Zeichen könnte es tun ( = , , ...).
  • negative Werte x < 0 sollte auf "niemals" umgestellt werden.
  • interval:0 Ich würde von einem "minütlichen" Intervall (0-59 Sek. oder mehr...) ausgehen.
  • Ausnahmen beim Zahlenformat führen zu 24 * 60 Minuten (~"täglich").

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X