Wie löscht man den Cache von Apache Maven?

212

In letzter Zeit scheint Apache Maven Probleme mit dem Caching zu haben. Durch Neuinstallationen unserer Projekte unter Windows Vista oder Windows 7 werden manchmal Artefakte mit denselben Daten wie bei einem vorherigen Build erstellt, obwohl die Dateien des neueren Artefakts hätten aktualisiert werden müssen.

Gibt es eine Möglichkeit, diesen Cache zu leeren, um Maven zu zwingen, immer einen sauberen Build des lokalen Artefakts auszulösen, das erstellt werden soll?

Insbesondere haben wir Probleme beim Erstellen einer Webanwendung mit dem Kriegs-Plugin. Maven-Version ist 3.0.3. Die Version des War Plugins ist 2.1.1.

MetroidFan2002
quelle
2
Haben Sie die -UFlagge ausprobiert, mit der Artefakte aktualisiert werden?
Amir Raminfar
2
Können Sie weitere Details angeben? Werden die Angehörigen im Krieg nicht auf den neuesten Stand gebracht? Wenn ja, haben die Angehörigen SNAPSHOT-Versionen?
Raghuram
Ist es ein Multimodul-Projekt? Haben Sie die Versionsnummer der abhängigen Module überprüft? Könnten Sie reproduzieren? mvn clean installdie neuen Artefakte in das lokale Repository stellen?
Palacsint
@ MetroidFan2002 Können wir hier bitte eine markierte Antwort haben? Oder Sie können eine Lösung schreiben, wenn Sie selbst eine gefunden haben.
Naman
1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Antworten:

225

Löschen Sie die Artefakte (oder das vollständige lokale Repo) c:\Users\<username>\.m2\repositoryvon Hand.

Palacsint
quelle
4
Versuchte das schon, hat nicht funktioniert. Vielen Dank für den Vorschlag.
MetroidFan2002
3
Es scheint, als hätten selbst nach einem Neustart eine Menge Maven-Artefakte Griffe:The action can't be completed because the folder or file in it is open in another program. Close the folder or file and try again.
liltitus27
1
Beachten Sie, dass der Speicherort des Ordners auf Ihrem System variieren kann. In dieser Antwort erfahren Sie, wie Sie den Pfad des Maven-Repo-Ordners
abrufen können
9
@ liltitus27 das gleiche hier, nur das Löschen von ~ / .m2 / Repository hat nicht funktioniert, hat mvn dependency:purge-local-repositoryendlich funktioniert
qbert65536
Ja, das hat bei mir zu 100% funktioniert - Windows10 in einem Unternehmensnetzwerk als Benutzer, nicht als Administrator
Graeme Phillips
176

Verwenden Sie zum Bereinigen des lokalen Caches das Abhängigkeits-Plug-In.

  1. mvn dependency:purge-local-repository: Dies ist ein Versuch, die lokalen Repository-Dateien zu löschen, aber er füllt immer das lokale Repository, nachdem Dinge entfernt wurden.
  2. mvn dependency:purge-local-repository -DreResolve=false: Dies vermeidet das erneute Auflösen der Abhängigkeiten, scheint aber zeitweise immer noch ins Netzwerk zu gehen.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Dies wurde von Paweł Prażak hinzugefügt und scheint gut zu funktionieren. Ich würde das dritte verwenden, wenn das lokale Repo geleert werden soll, und das erste, wenn Sie nur das lokale Repo wegwerfen und die Abhängigkeiten erneut abrufen möchten.
Brian C.
quelle
4
Was ist der Unterschied zwischen ihnen?
Pieter De Bie
13
Der erste ist ein Versuch, die lokalen Repository-Dateien zu löschen, aber er füllt immer das lokale Repository, nachdem Dinge entfernt wurden. Die zweite Methode vermeidet die erneute Auflösung der Abhängigkeiten, scheint jedoch zeitweise immer noch ins Netzwerk zu gehen. Der dritte wurde von Paweł Prażak hinzugefügt und scheint gut zu funktionieren. Ich würde das dritte verwenden, wenn das lokale Repo geleert werden soll, und das erste, wenn Sie nur das lokale Repo wegwerfen und die Abhängigkeiten erneut abrufen möchten.
Brian C.
Über die Befehlszeile eines Linux-Systems. Sie müssen mvn installieren. maven.apache.org/install.html
Brian C.
Ich werde hinzufügen, dass Sie bestimmte Gruppen / Artefakte mit einem zusätzlichen Parameter ansprechen können. Diese Antwort ist definitiv das, wonach ich gesucht habe (Option 3). Hier ist dieser zusätzliche Parameter ::: mvn-Abhängigkeit: purge-local-repository -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder
Ich habe die dritte Option mit dem Ziel versucht, alle Inhalte im lokalen Repository zu löschen , aber es funktioniert nicht. Bis zu diesem Zeitpunkt besteht die einzigartige Möglichkeit, dieses Ziel zu erreichen, darin, alle Inhalte dieses Verzeichnisses manuell zu löschen. Ich habe das lokale Repository an einem anderen Ort als dem <User_Name>/.m2Ort. Ich bin mir nicht sicher, ob es der Grund wäre.
Manuel Jordan
13

Haben Sie überprüft / verändert die updatePolicy Einstellungen für Ihre Repositories in Ihrem settings.xml.

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.

Versuchen Sie es einzustellen always.

FrVaBe
quelle
1
Mögliche Hilfe für jeden Weg damit umzugehen ... Ich habe nicht <updatePolicy>in meiner pom.xml, aber es gibt<snapshotPolicy>
Al Lelopath
updatePolicy ist in meiner settings.xml immer überall eingestellt.
MasterJoe2
11

Ich würde folgendes tun:

mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end

Die Flags weisen maven an, nicht zu versuchen, Abhängigkeiten aufzulösen oder das Netzwerk zu erreichen. Löschen Sie, was Sie lokal sehen.

Und ignorieren Sie Fehler ( --fail-at-end) bis zum Ende. Dies ist manchmal nützlich für Projekte, bei denen die Abhängigkeiten etwas durcheinander sind oder die sich auf ein etwas durcheinandergebrachtes internes Repository stützen (es passiert).

luis.espinal
quelle
1
Reicht es nicht aus, den lokalen Cache-Ordner für diese Art der Bereinigung einfach zu löschen?
1
Sie könnten, wenn Sie jede einzelne transitive Abhängigkeit kennen. Aber dann wird es langweilig (oder wir könnten einfach den gesamten Cache löschen, aber das zwingt Maven, alles für Dinge, die nichts mit dem fraglichen Artefakt zu tun haben, erneut herunterzuladen.) Es hängt alles von den Besonderheiten der Situation ab.
luis.espinal
6

Dies funktioniert in der Spring Tool Suite v 3.1.0.RELEASE, aber ich vermute, dass es auch in Eclipse verfügbar ist.

Nach dem Löschen der Artefakte von Hand (wie oben von palacsint angegeben) in der /username/.m2 Verzeichnis , indizieren Sie die Dateien wie folgt neu:

Gehe zu:

  • Windows->Preferences->Maven->User Settings Speisekarte.

Klicken Sie auf die ReindexSchaltfläche neben dem Local RepositoryTextfeld. Klicken Sie auf "Übernehmen" und dann auf "OK" und Sie sind fertig.

Felby
quelle
2

Wie einige Antworten gezeigt haben, möchten Sie manchmal das lokale Repository wirklich vollständig löschen. Beispielsweise gibt es möglicherweise einige Artefakte, die nicht gelöscht werden können, da sie vom POM nicht mehr referenziert werden.

Wenn Sie diese Löschung in eine Maven-Phase einbetten möchten, cleankönnen Sie beispielsweise maven-clean-plugindas Repository verwenden und über die folgenden Einstellungen auf das Repository zugreifen:

 <plugin>
    <inherited>false</inherited>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <phase>clean</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <echo>Base clean is attached to deleting local maven cache</echo>
                    <echo>${settings.localRepository}</echo>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <inherited>false</inherited>
    <artifactId>maven-clean-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <filesets>
            <fileset>
                <directory>${settings.localRepository}</directory>
            </fileset>
        </filesets>
    </configuration>
</plugin>
Maximilian Schulz
quelle
2

Verwenden mvn dependency:purge-local-repository -DactTransitively=false -Dskip=trueSie diese Option, wenn Sie Maven-Plugins als eines der Module haben. Andernfalls versucht Maven, sie neu zu kompilieren und lädt die Abhängigkeiten erneut herunter.

PedoDorf
quelle
1
Dies ist eigentlich das, wonach ich gesucht habe, es hat nur einen Tippfehler (es fehlt ein Bindestrich zum Überspringen): mvn-Abhängigkeit: purge-local-repository -DactTransitively = false -Dskip = true
shoguren
0

Ich hatte das gleiche Problem und habe dafür einen Einzeiler in Shell geschrieben.

rm -rf $(mvn help:evaluate -Dexpression=settings.localRepository\
                       -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN -B \
                       -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn | grep -vF '[INFO]')/*

Ich habe es als Einzeiler gemacht, weil ich ein Jenkins-Projekt haben wollte, um es einfach auszuführen, wann immer ich es brauchte, damit ich mich nicht bei Sachen usw. anmelden musste. Wenn Sie sich ein Shell-Skript dafür erlauben, Sie können es sauberer schreiben:

#!/usr/bin/env bash
REPOSITORY=$(mvn help:evaluate \
  -Dexpression=settings.localRepository \
  -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
  -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \
  --batch-mode \
  | grep -vF '[INFO]')

rm -rf $REPOSITORY/*

Sollte funktionieren, aber ich habe nicht das ganze Skript getestet. (Ich habe den ersten Befehl getestet, aber nicht das gesamte Skript.) Dieser Ansatz hat den Nachteil, dass zuerst ein großer komplizierter Befehl ausgeführt wird. Es ist idempotent, also können Sie es selbst testen. Das Löschen ist danach ein eigener Befehl. Auf diese Weise können Sie alles ausprobieren und überprüfen, ob es das tut, was Sie denken, da Sie Löschbefehlen nicht ohne Überprüfung vertrauen sollten. Es ist jedoch aus einem guten Grund klug: Es ist tragbar. Es respektiert Ihre settings.xml-Datei. Wenn Sie diesen Befehl ausführen und maven anweisen, eine bestimmte XML-Datei (das Argument -s oder --settings) zu verwenden, funktioniert dies weiterhin. Sie müssen also nicht herumspielen, um sicherzustellen, dass überall alles gleich ist.

Es ist ein bisschen umständlich, aber es ist eine anständige Art, Geschäfte zu machen, IMO.

Haakon Løtveit
quelle
-3

Es gibt also einige Befehle, die Sie zum Reinigen verwenden können

 1. mvn clean cache   
 2. mvn clean install 
 3. mvn clean install -Pclean-database

Auch das Löschen des Repository-Ordners aus .m2 kann helfen.

Codiee
quelle
1
Was soll "mvn clean cache" tun? Es scheint für mich kein anerkannter Befehl zu sein.
AMTerp