890

如何告诉 gradle 从存储库重新下载依赖项?

4

25 回答 25

983

通常,您可以使用命令行选项--refresh-dependencies 刷新缓存中的依赖项。您也可以删除~/.gradle/caches. 在下一次构建中,Gradle 会尝试再次下载它们。

您的具体用例是什么?您使用动态依赖版本还是 SNAPSHOT 版本?


在 Unix 系统上,您可以使用以下命令删除 Gradle 下载的所有现有工件(工件和元数据):

rm -rf $HOME/.gradle/caches/

请注意, --refresh-dependencies 不会总是重新下载每个工件;如果它们与存储库中存在的副本匹配,它将使用现有副本。从 Gradle 用户指南中,刷新依赖项:

--refresh-dependencies 选项告诉 Gradle 忽略已解析模块和工件的所有缓存条目。将对所有配置的存储库执行新的解析,重新计算动态版本,刷新模块并下载工件。但是,在可能的情况下,Gradle 将在再次下载之前检查先前下载的工件是否有效。这是通过将存储库中发布的 SHA1 值与现有下载工件的 SHA1 值进行比较来完成的。

[...]

认为使用 --refresh-dependencies 会强制下载依赖项是一种常见的误解。情况并非如此:Gradle 只会执行刷新动态依赖项严格要求的操作。这可能涉及下载新的列表或元数据文件,甚至是工件,但如果没有任何改变,影响是最小的。

于 2012-11-26T15:21:12.527 回答
883

如果您使用的是最新版本的 Gradle,则可以使用 --refresh-dependencies 选项。

./gradlew build --refresh-dependencies

你可以参考Gradle 手册

--refresh-dependencies 选项告诉 Gradle 忽略已解析模块和工件的所有缓存条目。将对所有配置的存储库执行新的解析,重新计算动态版本,刷新模块并下载工件。

于 2015-08-05T12:48:13.443 回答
343

您可以通过将依赖项标记为“正在更改”来告诉 Gradle 重新下载构建脚本中的一些依赖项。Gradle 将每 24 小时检查一次更新,但这可以使用 resolutionStrategy DSL 进行配置。我发现将它用于 SNAPSHOT 或 NIGHTLY 构建很有用。

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

扩展:

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

浓缩:

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

我在这个论坛帖子中找到了这个解决方案。

于 2013-02-11T01:49:21.727 回答
69

对于 MAC

./gradlew build --refresh-dependencies

对于 Windows

gradlew build --refresh-dependencies

也可以试试gradlew assembleDevelopmentDebug --refresh-dependencies

于 2016-10-21T18:15:52.393 回答
41

对于 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(或者如果使用 gradle 包装器)。gradlew build

注意:上面文件路径中的数字对您来说可能不同。

于 2016-07-11T10:03:04.823 回答
23

上述解决方案都不适合我。

如果您使用 IntelliJ,那么为我解决的只是刷新所有 Gradle 项目:

在此处输入图像描述

于 2019-04-02T07:33:11.700 回答
22

可以删除带有缓存 jar 的文件夹。

就我而言,在 Mac 上,该库被缓存在路径中:

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

我删除了缓存的库文件夹(上例中的“cached-library-to-remove”),删除了我的项目的构建文件夹并再次编译。然后下载了新库。

于 2016-08-18T13:25:27.803 回答
18

您可以删除特定组或工件 ID 的缓存,而不是像这里的一些答案建议的那样删除整个 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 将重新下载依赖项。

于 2016-11-22T18:12:17.660 回答
18

要刷新缓存的“发布”版本,唯一的选择是清除本地缓存。

rm -rf $HOME/.gradle/caches/

要刷新缓存的“快照”版本,您可以:

./gradlew build --refresh-dependencies
于 2020-04-01T11:41:29.443 回答
15

对于那些想知道在哪里运行 gradle 命令的人:

  1. 打开安卓工作室
  2. 点击终端(你会在 Android Studio 的基础上找到它)
  3. 命令工具将打开
  4. 输入你的命令gradlew build --refresh-dependencies
于 2018-10-03T10:32:28.717 回答
12

有两种方法可以做到这一点:

  1. 使用命令行选项刷新依赖关系。
  2. 您可以删除本地缓存,其中 artefasts 是 Gradle 的缓存并触发构建

使用--refresh-dependencies选项:

./gradlew build --refresh-dependencies

简短说明--refresh-dependencies 选项告诉 Gradle 忽略已解析模块和工件的所有缓存条目。

长解释

  • 使用 –refresh-dependencies' Gradle 将始终访问远程服务器以检查更新的工件:但是,Gradle 将避免下载缓存中已存在相同文件的文件。
    • First Gradle 将发出 HEAD 请求并检查服务器是否报告文件自上次以来未更改(如果“内容长度”和“上次修改”未更改)。在这种情况下,您将收到消息:“缓存的资源是最新的 (lastModified: {})。”
    • 如果可能,Next Gradle 将确定远程校验和(从 HEAD 请求或通过下载“.sha1”文件)。如果此校验和与已下载的另一个文件(从任何存储库)匹配,则 Gradle 将简单地将文件复制到缓存,而不是重新下载。在这种情况下,您将收到消息:““找到具有匹配校验和的本地可用资源:[{},{}]”。

使用删除:删除缓存时

rm -rf $HOME/.gradle/caches/

您只需清理所有缓存的 jar 和 sha1 总和,Gradle 处于您的机器上没有工件并且必须下载所有内容的情况。是的,它将第一次 100% 工作,但是当另一个 SNAPSHOT 被释放并且它是您的依赖关系树的一部分时,您将再次面临刷新或清除缓存的选择。

于 2018-08-05T05:31:01.230 回答
12

对于 Android Studio 3.4.1

只需打开 gradle 选项卡(可以位于右侧)并右键单击列表中的父级(应称为“Android”),然后选择“刷新依赖项”。

这应该可以解决您的问题。

于 2019-05-30T19:55:02.623 回答
9

这对我有用。通过取消选中 File>Settings>Gradle>Offline Work 中的按钮,确保 Gradle 未设置为脱机。

将此添加到您的 build.gradle 的顶层,很高兴拥有上述依赖项

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

我确保我的依赖项是这样编写的:

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

此后,我在 Android Studio 中打开 Gradle 面板并单击蓝色圆圈箭头按钮。我总能看到我的更新得到一个新的副本。

于 2017-11-26T20:20:56.867 回答
8

似乎change更改isChange为 gradle 版本 6.3、kotlin 版本 1.3.70、Groovy 2.5.10

工作配置是

implementation("com.sample:commons:1.0.0-SNAPSHOT") {
        isChanging = true
    }

此外,运行此命令以获取最新的

./gradlew assemble  --refresh-dependencies
于 2020-09-28T17:35:53.340 回答
5

如果您使用的是 Intellij,您可以右键单击根项目,然后选择刷新 gradle 依赖项。

在此处输入图像描述

于 2021-10-15T12:29:07.970 回答
5

Mb 我来晚了,但是我的解决方案是针对单个存储库的。我认为删除 ~/.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 中拖动文件。

于 2018-11-12T07:15:36.693 回答
4

就我而言,上述方法均无效,我所做的是:

  • build.gradle中,评论与我拥有的未解决导入相关的依赖项
  • 点击“立即同步”
  • 取消评论我刚刚评论的内容
  • 再次单击“立即同步”

然后我的进口再次得到妥善解决。

于 2020-02-20T17:05:44.273 回答
1

删除所有缓存会再次下载所有依赖项。所以这需要很长时间,而且很无聊,再次等待重新下载所有依赖项。

我怎么能通过以下方式解决这个问题。

只需删除需要刷新的组。

例如:如果我们想刷新com.user.test

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

然后从 build.gradle 中删除依赖项并重新添加它。然后它将刷新我们想要的依赖项。

于 2019-02-28T08:59:29.420 回答
0

如果您使用的是 eclipse 并且想要强制 eclipse 重新加载依赖项,您可以尝试以下命令

gradlew clean cleaneclipse build eclipse --refresh-dependencies
于 2018-09-20T06:22:33.893 回答
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/
于 2018-08-22T03:20:52.813 回答
0

我认为 gradle 2.14.1 解决了这个问题。接受的答案是正确的,但在 gradle 中存在一个带有 –refresh-dependencies 的错误。2.14.1 修复了这个问题。

https://discuss.gradle.org/t/refresh-dependencies-should-use-cachesharingmodulesfor-0s/556

于 2016-07-21T08:32:13.090 回答
0

只有手动删除缓存文件夹中的特定依赖项才能工作...由企业仓库中的同事构建的工件。

于 2020-01-07T10:35:17.617 回答
0

在大多数情况下,只需简单地重新构建项目就可以了。有时您必须./gradlew build --refresh-dependencies按照已经提到的几个答案运行(需要很长时间,具体取决于您有多少依赖项)。然而,有时这些都不起作用:依赖项不会得到更新。然后,您可以这样做:

  1. 从您的 gradle 文件中删除依赖项
  2. 运行/调试您的项目并等待它失败(有NonExistingClass原因)
  3. 点击“构建项目”并等待它成功完成
  4. 再次运行/调试

这很荒谬,看起来很疯狂,但我实际上每天都使用这个程序,仅仅是因为我需要的依赖项可以更新数十次,而且没有任何适当的解决方案会产生任何效果。

于 2018-06-20T13:59:43.513 回答
-1

删除此目录:

C:\Users\[username]\.gradle
于 2017-07-12T18:56:17.983 回答
-7

您需要重新下载它,这样您就可以手动下载并替换损坏的文件,然后再次同步您的项目。转到此位置 C:\users[username].gradle\wrapper\dist\gradle3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9\gradle-3.3-all.zip 此处删除 gradle3.3allzip 并通过从该站点重新下载来替换它 https:/ /services.gradle.org/distributions/ 找到相同的文件并将其下载并粘贴到该位置然后同步您的项目。希望它也适合你。

于 2017-06-15T05:10:08.610 回答