Wie kann ich Gradle zwingen, Abhängigkeiten erneut herunterzuladen?

741

Wie kann ich gradle anweisen, Abhängigkeiten aus Repositorys erneut herunterzuladen?

fedor.belov
quelle

Antworten:

845

Im Allgemeinen können Sie Abhängigkeiten in Ihrem Cache mit der Befehlszeilenoption --refresh-dependencies aktualisieren . Sie können die zwischengespeicherten Dateien auch unter löschen ~/.gradle/caches. Mit dem nächsten Build würde Gradle versuchen, sie erneut herunterzuladen.

Was ist Ihr spezifischer Anwendungsfall? Verwenden Sie dynamische Abhängigkeitsversionen oder SNAPSHOT-Versionen?


Auf Unix-Systemen können Sie alle vorhandenen Artefakte (Artefakte und Metadaten) löschen, die Gradle heruntergeladen hat, indem Sie:

rm -rf $HOME/.gradle/caches/
Benjamin Muschko
quelle
27
Ich kann nicht für das OP sprechen, aber mein spezieller Anwendungsfall besteht darin, zu testen, ob meine Konfiguration eines Nicht-MavenCentral-Repositorys tatsächlich funktioniert.
Emil Lundberg
7
Sie müssen auch das Verzeichnis ~ / .m2 entfernen (falls vorhanden). Wenn Sie Maven Repo konfiguriert haben, werden einige dieser Artefakte auch auf ~ / .m2 heruntergeladen. Entfernen Sie besser sowohl ~ / .gradle als auch ~ / .m2, um mit sauberem Schiefer zu beginnen.
Gopinath MR
17
Maven Local ist nur relevant, wenn Ihr Build es als Repository definiert.
Benjamin Muschko
21
@Gopinath das ist ein gefährlicher Rat, da .m2 eine Maven-Einstellungsdatei enthalten kann. Ich denke du meinst .m2 / repository löschen
Ward
9
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
Fangzhzh
708

Wenn Sie eine aktuelle Version von Gradle verwenden, können Sie die Option --refresh-dependencies verwenden.

./gradlew build --refresh-dependencies

Sie können sich auf das Gradle-Handbuch beziehen .

Die Option --refresh-dependencies weist Gradle an, alle zwischengespeicherten Einträge für aufgelöste Module und Artefakte zu ignorieren. Für alle konfigurierten Repositorys wird eine neue Auflösung durchgeführt, wobei dynamische Versionen neu berechnet, Module aktualisiert und Artefakte heruntergeladen werden.

Naga
quelle
10
Sie müssen beachten, dass es einige Zeit dauert, da gradle versucht, alle Abhängigkeitsdateien herunterzuladen.
Naga
11
Es ist auch erwähnenswert, dass dies nicht immer funktioniert. Ich habe gerade getestet, wie ich "gradle clear war --refresh-dependencies" mit einem zwischengespeicherten Glas ausgeführt habe, das drei Tage alt war, als ich gestern Abend eine neue Version bereitgestellt hatte. Der Build wurde aufgrund einer fehlenden Abhängigkeit unterbrochen, die im neuen Code hinzugefügt wurde. Ich hatte danach immer noch das drei Tage alte Glas im Cache. Am Ende habe ich nur den Versionsordner in meinem .m2-Cache gelöscht und neu erstellt. Es bekam dann die neueste Version, weil es im Grunde keine Wahl hatte!
Spanky Quigman
10
besser noch nur ./gradlew --refresh-Abhängigkeiten
Headsvk
1
Dies funktionierte hervorragend als './gradlew build --refresh-dependencies' vom Android Studio-Terminal. Vielen Dank!
the_dude_abides
2
Gibt es eine Möglichkeit, Android Studio dazu zu bringen, dies für einen Build innerhalb der IDE zu tun?
Karl
313

Sie können Gradle anweisen, einige Abhängigkeiten im Build-Skript erneut herunterzuladen, indem Sie die Abhängigkeit als "Ändern" kennzeichnen. Gradle sucht dann alle 24 Stunden nach Updates. Dies kann jedoch mit der AuflösungStrategy DSL konfiguriert werden. Ich finde es nützlich, dies für SNAPSHOT- oder NIGHTLY-Builds zu verwenden.

configurations.all {
    // Check for updates every build
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Erweitert:

dependencies {
    implementation group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
}

Kondensiert:

implementation('group:projectA:1.1-SNAPSHOT') { changing = true }

Ich habe diese Lösung in diesem Forenthread gefunden .

Umi
quelle
4
Wissen Sie zufällig, wie dies für Quellen für dieselbe Bibliothek funktioniert? Derzeit wird die kompilierte Bibliothek bei jeder Änderung heruntergeladen, die Quelle jedoch nicht.
Markus Wüstenberg
2
Eine Snapshot-Version "ändert" sich per Definition. Gradle weiß das, sodass Sie dies in Ihrer Abhängigkeitsdeklaration nicht definieren müssen.
Benjamin Muschko
4
Danke dafür. FWIW, unsere Abhängigkeit war von einer Snapshot-Version und bis wir dies taten, wurde nicht bei jedem Build nach Updates gesucht.
sfitts
10
cacheChangingModulesForist der Schlüssel, changing: trueist optional, weil es impliziert ist -SNAPSHOT, es ist möglich, die Kurzschrift hier zu verwenden: compile 'group:projectA:1.1-SNAPSHOT'wegen der obigen Implikation. Man kann die Auflösungsstrategie auch auf eine Konfiguration beschränken : configurations.compile.resolutionS....
TWiStErRob
2
@Umi Gibt es eine komprimierte Version davon? Wie zum Beispiel compile 'com.burrowsapps:ads:1.0:true'?
Jared Burrows
63

Für MAC

./gradlew build --refresh-dependencies

Für Windows

gradlew build --refresh-dependencies

Kann es auch versuchen gradlew assembleDevelopmentDebug --refresh-dependencies

Ali
quelle
2
Android verwendet reguläres Gradle. Es ist nur ein Plugin.
Dragas
Der Gradle-Wrapper ist nicht exklusiv für Android. Sie können eine gradle wrapperAufgabe erstellen. Sie können sogar einen Wrapper mit einem anderen Gradle-Wrapper generieren:gradlew wrapper
Salvioner
28

Für Windows ... um Gradle dazu zu bringen, bestimmte Abhängigkeiten erneut herunterzuladen :

  1. Löschen Sie die Abhängigkeiten, die Sie erneut herunterladen möchten, aus dem folgenden Verzeichnis:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. Löschen Sie alle Metadatenverzeichnisse im Pfad:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. Führen Sie gradle build(oder gradlew buildwenn Sie einen Gradle-Wrapper verwenden) das Stammverzeichnis des Projekts aus.

Hinweis: Die Nummern in den obigen Dateipfaden können für Sie unterschiedlich sein.

Eric
quelle
19

Man kann Ordner mit zwischengespeicherten Gläsern entfernen.

In meinem Fall wurde die Bibliothek auf einem Mac im Pfad zwischengespeichert:

/Users/MY_NAME/.gradle/caches/modules-2/files-2.1/cached-library-to-remove

Ich habe den zwischengespeicherten Bibliotheksordner entfernt (im obigen Beispiel "zu entfernende zwischengespeicherte Bibliothek"), den Build-Ordner meines Projekts gelöscht und erneut kompiliert. Dann wurde eine neue Bibliothek heruntergeladen.

Farhan
quelle
16

Anstatt Ihren gesamten Gradle-Cache zu entfernen, wie einige Antworten hier vorschlagen, können Sie den Cache für eine bestimmte Gruppen- oder Artefakt-ID löschen. Ich habe die folgende Funktion zu meiner hinzugefügt .bash_profile:

deleteGradleCache() {
  local id=$1
  if [ -z "$id" ]; then
    echo "Please provide an group or artifact id to delete"
    return 1
  fi
  find ~/.gradle/caches/ -type d -name "$id" -prune -exec rm -rf "{}" \; -print
}

Verwendungszweck:

$ deleteGradleCache com.android.support

Beim nächsten Build oder beim erneuten Synchronisieren lädt gradle die Abhängigkeiten erneut herunter.

Jared Rummler
quelle
9

Dafür gibt es zwei Möglichkeiten:

  1. Verwenden der Befehlszeilenoption zum Aktualisieren von Abhängigkeiten.
  2. Sie können den lokalen Cache löschen, in dem Artefakte Caches von Gradle sind, und den Build auslösen

Verwenden der Option --refresh-dependencies :

./gradlew build --refresh-dependencies

Kurze Erklärung - Die Option --refresh-dependencies weist Gradle an, alle zwischengespeicherten Einträge für aufgelöste Module und Artefakte zu ignorieren.

Lange Erklärung

  • Mit –refresh-dependencies 'Gradle schlägt immer auf dem Remote-Server nach aktualisierten Artefakten. Gradle vermeidet jedoch das Herunterladen einer Datei, in der dieselbe Datei bereits im Cache vorhanden ist.
    • First Gradle stellt eine HEAD-Anfrage und prüft, ob der Server die Datei seit dem letzten Mal als unverändert meldet (wenn die 'Inhaltslänge' und 'Zuletzt geändert' unverändert sind). In diesem Fall erhalten Sie die Meldung: "Die zwischengespeicherte Ressource ist aktuell (lastModified: {})."
    • Next Gradle ermittelt die Remote-Prüfsumme nach Möglichkeit (entweder aus der HEAD-Anforderung oder durch Herunterladen einer '.sha1'-Datei). Wenn diese Prüfsumme mit einer anderen bereits heruntergeladenen Datei (aus einem beliebigen Repository) übereinstimmt, kopiert Gradle die Datei einfach in die Cache, anstatt erneut herunterzuladen. In diesem Fall erhalten Sie die Meldung: "Lokal verfügbare Ressource mit übereinstimmender Prüfsumme gefunden: [{}, {}]".

Löschen verwenden: Wenn Sie Caches löschen

rm -rf $HOME/.gradle/caches/

Sie reinigen einfach alle zwischengespeicherten Gläser und sha1-Summen, und Gradle befindet sich in einer Situation, in der sich keine Artefakte auf Ihrem Computer befinden und alles heruntergeladen werden muss. Ja, es funktioniert zum ersten Mal zu 100%, aber wenn ein anderer SNAPSHOT veröffentlicht wird und er Teil Ihres Abhängigkeitsbaums ist, stehen Sie erneut vor der Wahl, die Caches zu aktualisieren oder zu löschen.

Xelian
quelle
9

Das hat bei mir funktioniert. Stellen Sie sicher, dass Gradle nicht offline ist, indem Sie die Schaltfläche unter Datei> Einstellungen> Gradle> Offline-Arbeit deaktivieren.

Fügen Sie dies zur obersten Ebene Ihres build.gradle hinzu, schön, dass Sie die oben genannten Abhängigkeiten haben

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Ich habe sichergestellt, dass meine Abhängigkeiten folgendermaßen geschrieben sind:

implementation('com.github.juanmendez:ThatDependency:ThatBranch-SNAPSHOT') {
    changing = true
}

Danach öffne ich das Gradle-Bedienfeld in Android Studio und klicke auf die Schaltfläche mit den blauen Kreispfeilen. Ich kann immer sehen, dass meine Updates eine neue Kopie erhalten.

Juan Mendez
quelle
9

Keine der oben genannten Lösungen hat bei mir funktioniert.

Wenn Sie IntelliJ verwenden, hat es für mich einfach alle Gradle-Projekte aktualisiert:

Geben Sie hier die Bildbeschreibung ein

Kobbi Gal
quelle
7

Für diejenigen, die sich fragen, wo Gradle-Befehle ausgeführt werden sollen:

  1. Öffnen Sie Android Studio
  2. Klicken Sie auf Terminal (Sie finden es in der Basis von Android Studio)
  3. Das Befehlstool wird geöffnet
  4. Geben Sie Ihren Befehl ein gradlew build --refresh-dependencies
kgandroid
quelle
6

Für Android Studio 3.4.1

Öffnen Sie einfach die Registerkarte "Gradle" (befindet sich rechts) und klicken Sie mit der rechten Maustaste auf das übergeordnete Element in der Liste (sollte "Android" heißen). Wählen Sie dann "Abhängigkeiten aktualisieren".

Dies sollte Ihr Problem beheben.

Carl Du Plessis
quelle
4

Mb Ich bin zu spät, aber meine Lösung ist für ein einzelnes Repository. Ich denke, das Löschen von ~ / .gradle / * ist übertrieben. Das Problem, auf das ich gestoßen bin, war, dass ich ein Verzeichnis löschte, in dem sich Quellen befanden, und gradle eine andere Version erhielt, die nicht von nexus stammt. Um dies zu vermeiden, führe ich das nächste aus:

~/.gradle$ find . -type d -name 'group.plugins.awssdk'
./caches/modules-2/files-2.1/group.plugins.awssdk
./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

~/.gradle$ rm -r ./caches/modules-2/files-2.1/group.plugins.awssdk   ./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

Danach zieht gradle Dateien aus dem Nexus.

Vadim
quelle
2

Um die zwischengespeicherte Release-Version zu aktualisieren, besteht die einzige Option darin, den lokalen Cache zu löschen.

rm -rf $HOME/.gradle/caches/

So aktualisieren Sie die zwischengespeicherte Snapshot-Version:

./gradlew build --refresh-dependencies
Karol Król
quelle
1

Wenn Sie alle Caches löschen, werden alle Abhängigkeiten erneut heruntergeladen. Es dauert also so lange und es ist langweilig, noch einmal zu warten, um alle Abhängigkeiten erneut herunterzuladen.

Wie auch immer, ich könnte dies unten lösen.

Löschen Sie einfach Gruppen, die aktualisiert werden müssen.

Beispiel: Wenn wir die Gruppe com.user.test aktualisieren möchten

rm -fr ~/.gradle/caches/modules-2/files-2.1/com.user.test/

Entfernen Sie dann die Abhängigkeit von build.gradle und fügen Sie sie erneut hinzu. dann werden die Abhängigkeiten aktualisiert, was wir wollen.

Chamly Idunil
quelle
0

Löschen Sie dieses Verzeichnis:

C:\Users\[username]\.gradle
farhang67
quelle
3
Angesichts potenziell lokaler Konfigurationen ist das Löschen (oder Umbenennen / Verschieben) des Caches-Verzeichnisses, wie in anderen Antworten erwähnt, eine bessere Lösung.
dimwittedanimal
0

In den meisten Fällen reicht es aus, das Projekt einfach neu aufzubauen. Manchmal müssen Sie ausführen, ./gradlew build --refresh-dependencieswie bereits mehrere Antworten erwähnt haben (dies dauert lange, je nachdem, wie viele Abhängigkeiten Sie haben). Manchmal funktioniert jedoch keines davon: Die Abhängigkeit wird einfach nicht aktualisiert. Dann können Sie dies tun:

  1. Entfernen Sie die Abhängigkeit aus Ihrer Gradle-Datei
  2. Führen Sie Ihr Projekt aus / debuggen Sie es und warten Sie, bis es fehlschlägt (mit NonExistingClassGrund).
  3. Klicken Sie auf "Projekt erstellen" und warten Sie, bis es erfolgreich abgeschlossen wurde
  4. Führen Sie das Programm erneut aus / debuggen Sie es

Das ist lächerlich und scheint Wahnsinn zu sein, aber ich verwende dieses Verfahren tatsächlich täglich, einfach weil die Abhängigkeit, die ich brauche, Dutzende Male aktualisiert werden kann und keine der angemessenen Lösungen Auswirkungen haben würde.

egorikem
quelle
0

Sie können es so machen

https://marschall.github.io/2017/04/17/disabling-gradle-cache.html

Zitat aus Deaktivieren des Gradle-Build-Cache

Der Gradle-Build-Cache kann eine großartige Sache sein, wenn Sie regelmäßig> große Projekte mit Gradle erstellen. Wenn jedoch nur gelegentlich Open Source-Projekte erstellt werden, kann dies schnell zu einer großen Größe führen.

Um den Gradle-Build-Cache zu deaktivieren, fügen Sie die folgende Zeile hinzu ~/.gradle/gradle.properties

org.gradle.caching=false

Sie können den vorhandenen Cache mit bereinigen

rm -rf $HOME/.gradle/caches/
rm -rf $HOME/.gradle/wrapper/
Wuqilong
quelle
0

Wenn Sie Eclipse verwenden und Eclipse zum erneuten Laden von Abhängigkeiten erzwingen möchten, können Sie den folgenden Befehl verwenden

gradlew clean cleaneclipse build eclipse --refresh-dependencies
ULLAS K.
quelle
2
Warum sollten Sie Eclipse verwenden? Besonders im Jahr 2018!
Christopher Perry
0

Nur ein manuelles Löschen der spezifischen Abhängigkeit im Cache-Ordner funktioniert ... ein Artefakt, das von einem Kollegen in Enterprise Repo erstellt wurde.

WesternGun
quelle
0

In meinem Fall hat keines der oben genannten Verfahren funktioniert. Ich habe Folgendes getan:

  • In build.gradle, kommentieren die zu den ungelösten Einfuhren Abhängigkeiten Ich hatte
  • Klicken Sie auf "Jetzt synchronisieren".
  • Nicht kommentieren, was ich gerade kommentiert habe
  • Klicken Sie erneut auf "Jetzt synchronisieren"

Dann wurden meine Importe wieder richtig aufgelöst.

Louis
quelle
-7

Sie müssen es erneut herunterladen, damit Sie die beschädigte Datei entweder manuell herunterladen und ersetzen und Ihr Projekt erneut synchronisieren können. Gehen Sie zu diesem Speicherort C: \ users [Benutzername] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip. Löschen Sie hier gradle3.3allzip und ersetzen Sie es, indem Sie es erneut von dieser Site herunterladen. Https : / /services.gradle.org/distributions/ Suchen Sie dieselbe Datei und laden Sie sie herunter und fügen Sie sie an diesem Speicherort ein. Synchronisieren Sie dann Ihr Projekt. Hoffe es funktioniert auch bei dir.

Rahul Gupta
quelle