Как я могу заставить gradle перезагружать зависимости?


742

Как я могу сказать gradle для повторной загрузки зависимостей из репозиториев?

Ответы:


845

Как правило, вы можете обновить зависимости в вашем кэше с помощью параметра командной строки --refresh-dependencies . Вы также можете удалить кэшированные файлы в ~/.gradle/caches. При следующей сборке Gradle попытается загрузить их снова.

Каков ваш конкретный вариант использования? Используете ли вы динамические версии зависимостей или версии SNAPSHOT?


В системах Unix вы можете удалить все существующие артефакты (артефакты и метаданные), загруженные Gradle с помощью:

rm -rf $HOME/.gradle/caches/

27
Я не могу говорить за OP, но мой конкретный вариант использования - проверить, действительно ли работает моя конфигурация репозитория не MavenCentral.
Эмиль Лундберг

7
Вам также необходимо удалить каталог ~ / .m2 (если существует). Если вы настроили репозиторий Maven, некоторые из этих артефактов также будут загружены в ~ / .m2. Лучше убрать ~ / .gradle и ~ / .m2, чтобы начать с чистого листа.
Гопинат М.Р.

17
Maven Local имеет значение только в том случае, если ваша сборка определяет его как хранилище.
Бенджамин Мущко

21
@Gopinath - это опасный совет, так как .m2 может содержать файл настроек maven. Я думаю, вы имеете в виду удалить .m2 / хранилище
Ward

9
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
фанжж

709

Если вы используете последнюю версию Gradle, вы можете использовать опцию --refresh-dependencies.

./gradlew build --refresh-dependencies

Вы можете обратиться к руководству Gradle .

Опция --refresh-dependencies указывает Gradle игнорировать все кэшированные записи для разрешенных модулей и артефактов. Новое разрешение будет выполнено для всех настроенных репозиториев с пересчетом динамических версий, обновлением модулей и загрузкой артефактов.


10
Следует отметить, что поскольку gradle попытается загрузить все файлы зависимостей, это займет много времени.
Нага

11
Стоит также отметить, что это не всегда работает. Я только что протестировал запуск «gradle clear war --refresh-dependencies» с кешированным файлом jar, которому было три дня, когда я вчера развернул новую версию. Сборка прервалась из-за отсутствующей зависимости, которая была добавлена ​​в новый код. После этого у меня все еще была трехдневная банка в тайнике. В итоге я просто удалил папку с версиями в моем кэше .m2 и перестроил ее. Затем он получил новейшую версию, потому что у него практически не было выбора!
Spanky Quigman

10
еще лучше просто ./gradlew --refresh-dependencies
Headsvk

1
Это прекрасно работало как './gradlew build --refresh-dependencies' из терминала Android Studio. Спасибо!
the_dude_abides

2
Есть ли способ заставить Android Studio сделать это на сборке из IDE?
Карл

314

Вы можете указать Gradle повторно загрузить некоторые зависимости в сценарии сборки, пометив зависимость как «изменяющуюся». Gradle будет проверять наличие обновлений каждые 24 часа, но это можно настроить с помощью ResolutionStrategy DSL. Я считаю полезным использовать это для SNAPSHOT или NIGHTLY.

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

Expanded:

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

Сгущенное:

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

Я нашел это решение в этой ветке форума .


4
Вы случайно не знаете, как это работает с источниками для той же библиотеки? В настоящее время скомпилированная библиотека загружается каждый раз, когда она изменяется, а источник - нет.
Маркус Вюстенберг

2
Версия снимка «меняется» по определению. Gradle знает это, поэтому вам не нужно определять это в объявлении зависимости.
Бенджамин Мущко

4
Спасибо за это. FWIW, наша зависимость была от версии моментального снимка, и пока мы не сделали это, она не проверяла обновления для каждой сборки.
Sfitts

10
cacheChangingModulesForявляется ключом, changing: trueявляется необязательным, потому что подразумевается -SNAPSHOT, здесь можно использовать сокращение: compile 'group:projectA:1.1-SNAPSHOT'из-за вышеупомянутого значения. Можно также ограничить resolutionStrategy к одной конфигурации: configurations.compile.resolutionS....
TWiStErRob

2
@ Umi Есть сжатая версия этого? Такие как compile 'com.burrowsapps:ads:1.0:true'?
Джаред Берроуз

63

Для MAC

./gradlew build --refresh-dependencies

Для Windows

gradlew build --refresh-dependencies

Можно также попробовать gradlew assembleDevelopmentDebug --refresh-dependencies


2
Android использует обычный gradle. Это просто плагин.
Dragas

Оболочка Gradle не является эксклюзивной для Android. Вы можете создать один с помощью gradle wrapperзадачи; Вы даже можете создать оболочку, используя другую оболочку Gradle:gradlew wrapper
Salvioner

28

Для Windows ... для того, чтобы заставить gradle повторно загружать определенные зависимости:

  1. удалите зависимости, которые вы хотите повторно загрузить из каталога ниже:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. удалить все каталоги метаданных по пути:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. запустить gradle build(или, gradlew buildесли используется gradle wrapper) в корневом каталоге проекта.

примечание: числа в путях к файлам выше могут отличаться для вас.


19

Можно удалить папку с кешированными банками.

В моем случае на Mac библиотека кэшировалась по пути:

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

Я удалил папку с кэшированной библиотекой («cached-library-to-remove» в приведенном выше примере), удалил папку сборки моего проекта и снова скомпилировал. Свежая библиотека была загружена тогда.


16

Вместо удаления всего кэша Gradle, как предлагают некоторые ответы здесь, вы можете удалить кэш для определенной группы или идентификатора артефакта. Я добавил следующую функцию в мой .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
}

Применение:

$ deleteGradleCache com.android.support

Затем при следующей сборке или при повторной синхронизации gradle повторно загрузит зависимости.


9

Есть 2 способа сделать это:

  1. Использование параметра командной строки для обновления кэша зависимостей.
  2. Вы можете удалить локальный кеш, где артефакты являются кешами Gradle и запустить сборку

Используя параметр --refresh-dependencies :

./gradlew build --refresh-dependencies

Краткое объяснение --refresh-dependencies опция указывает Gradle игнорировать все кэшированные записи для разрешенных модулей и артефактов.

Долгое объяснение

  • WIth –refresh-dependencies 'Gradle всегда будет обращаться к удаленному серверу, чтобы проверить наличие обновленных артефактов: однако, Gradle будет избегать загрузки файла, в котором тот же файл уже существует в кэше.
    • First Gradle выполнит запрос HEAD и проверит, сообщает ли сервер файл без изменений с прошлого раза (если «content-length» и «last-updated» не изменились). В этом случае вы получите сообщение: «Кэшированный ресурс обновлен (lastModified: {})».
    • Next Gradle определит удаленную контрольную сумму, если это возможно (либо из запроса HEAD, либо путем загрузки файла '.sha1'). Если эта контрольная сумма совпадает с другим файлом, уже загруженным (из любого хранилища), то Gradle просто скопирует файл в кеш, а не повторная загрузка. В этом случае вы получите сообщение: «« Найден локально доступный ресурс с соответствующей контрольной суммой: [{}, {}] ».

Использование delete: при удалении кешей

rm -rf $HOME/.gradle/caches/

Вы просто очищаете все кэшированные банки и суммы sha1, и Gradle находится в ситуации, когда на вашем компьютере нет артефактов, и он должен загрузить все. Да, он будет работать на 100% в первый раз, но когда будет выпущен другой SNAPSHOT, и он станет частью вашего дерева зависимостей, вам снова придется столкнуться с выбором обновления или очистки кешей.


9

Это сработало для меня. Убедитесь, что Gradle не переведен в автономный режим, сняв отметку с кнопки «Файл»> «Настройки»> «Gradle»> «Автономная работа».

Добавьте это на верхний уровень вашего build.gradle, приятно иметь вышеуказанные зависимости

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

Я убедился, что мои зависимости написаны так:

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

После этого я открываю панель Gradle в Android Studio и нажимаю кнопку со стрелками синего круга. Я всегда вижу, как мои обновления получают новую свежую копию.


9

Ни одно из приведенных выше решений не помогло мне.

Если вы используете IntelliJ, я решил просто обновить все проекты Gradle:

введите описание изображения здесь


7

Для тех, кому интересно, где запускать команды gradle:

  1. Откройте Android Studio
  2. Нажмите на терминал (вы найдете его в базе Android Studio)
  3. Командный инструмент откроется
  4. Введите вашу команду gradlew build --refresh-dependencies

6

Для Android Studio 3.4.1

Просто откройте вкладку Gradle (может быть расположена справа) и щелкните правой кнопкой мыши на родительском элементе в списке (должен называться «Android»), затем выберите «Обновить зависимости».

Это должно решить вашу проблему.


4

Я слишком поздно, но мое решение для одного хранилища. Я думаю, что удаление ~ / .gradle / * излишне. Проблема, с которой я столкнулся, заключалась в том, что я удалял каталог, в котором находились источники, а Gradle получал другую версию, а не от Nexus. Чтобы избежать этого, я запускаю следующее:

~/.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

После этого Gradle перетаскивает файлы из Nexus.


2

Чтобы обновить кешированную «релизную» версию, единственный вариант - очистить локальный кеш.

rm -rf $HOME/.gradle/caches/

Чтобы обновить кэшированную версию «снимка», вы можете:

./gradlew build --refresh-dependencies

1

Удаление всех кешей заставляет снова загрузить все зависимости. так что это заняло так много времени и это скучно ждать снова, чтобы снова загрузить все зависимости.

Как только я смогу решить эту проблему ниже.

Просто удалите группы, которые необходимо обновить.

Пример: если мы хотим обновить группу com.user.test

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

затем удалите зависимость из build.gradle и повторно добавьте ее. тогда он обновит зависимости, что мы хотим.



0

удалить этот каталог:

C:\Users\[username]\.gradle

3
Учитывая, что существуют потенциально локальные конфигурации, удаление, (или переименование / перемещение) каталога кэшей, как упомянуто в других ответах, является лучшим решением.
dimwittedanimal

0

В большинстве случаев достаточно просто перестроить проект. Иногда вам нужно запустить, так ./gradlew build --refresh-dependenciesкак несколько ответов уже упоминалось (это занимает много времени, в зависимости от того, сколько у вас зависимостей). Однако иногда ни один из них не будет работать: зависимость не будет обновлена. Затем вы можете сделать это:

  1. Удалить зависимость из вашего файла Gradle
  2. Запустите / отладьте ваш проект и дождитесь его сбоя (с NonExistingClassуказанием причины)
  3. Нажмите «построить проект» и дождитесь его успешного завершения
  4. Запустить / отладить еще раз

Это смешно и выглядит как безумие, но я на самом деле использую эту процедуру ежедневно, просто потому, что нужная мне зависимость может обновляться десятки раз, и ни одно из адекватных решений не будет иметь никакого эффекта.


0

Вы можете сделать это так

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

Цитировать из Отключение кэша сборки Gradle

Кэш сборки Gradle может быть полезен, когда вы регулярно создаете большие проекты с помощью Gradle. Однако, когда только время от времени создаются проекты с открытым исходным кодом, он может быстро стать большим.

Чтобы отключить кэш сборки Gradle, добавьте следующую строку в ~/.gradle/gradle.properties

org.gradle.caching=false

Вы можете очистить существующий кеш с помощью

rm -rf $HOME/.gradle/caches/
rm -rf $HOME/.gradle/wrapper/

0

Если вы используете eclipse и если вы хотите, чтобы eclipse перезагружал зависимости, попробуйте команду ниже

gradlew clean cleaneclipse build eclipse --refresh-dependencies

2
Почему вы используете Eclipse? Особенно в 2018 году!
Кристофер Перри

0

Работает только ручное удаление определенной зависимости в папке кеша ... артефакт, созданный коллегой по корпоративному репо.


0

В моем случае ничего из вышеперечисленного не сработало, я сделал следующее:

  • В build.gradle, комментируя зависимости, связанные с неразрешенным импортом
  • Нажав «Синхронизировать сейчас»
  • Раскомментируя то, что я только что прокомментировал
  • Снова нажмите «Синхронизировать сейчас»

Тогда мой импорт снова был правильно разрешен.


-7

Вам необходимо повторно загрузить его, чтобы вы могли вручную загрузить и заменить поврежденный файл и снова синхронизировать ваш проект. Перейдите по этому адресу C: \ users [username] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip Здесь удалите gradle3.3allzip и замените его, загрузив снова с этого сайта https: / /services.gradle.org/distributions/ Найдите тот же файл, загрузите и вставьте его в это место. Затем синхронизируйте ваш проект. Надеюсь, это работает и для вас.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.