如何强制gradle重新下载依赖项?

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

896155 次浏览

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

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


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

rm -rf $HOME/.gradle/caches/

请注意,——刷新依赖项并不总是重新下载每个工件;如果它们与存储库中存在的内容匹配,它将使用现有副本。来自Gradle用户指南,刷新依赖

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

[…]

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

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

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

扩展:

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

浓缩:

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

我在这里找到了这个解决方案论坛主题

如果您使用的是最新版本的Gradle,您可以使用--刷新依赖项选项。

./gradlew build --refresh-dependencies

你可以参考Gradle手册

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

对于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)。

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

我认为gradle 2.14.1解决了这个问题。接受的答案是正确的,但是gradle中有一个bug-刷新-依赖项。2.14.1修复了这个问题。

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

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

在我的例子中,在mac库缓存在路径:

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

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

对于MAC

./gradlew build --refresh-dependencies

对于windows

gradlew build --refresh-dependencies

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

您可以删除特定组或工件ID的缓存,而不是像这里的一些答案建议的那样删除整个gradle缓存。我在我的.bash_profile中添加了以下函数:

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

用法:

$ deleteGradleCache com.android.support

然后,在下一次构建或重新同步时,gradle将重新下载依赖项。

您需要重新下载它,因此您可以手动下载并替换损坏的文件并再次同步您的项目。转到此位置C:\users[用户名].gradle\wrapper\dist\gradle3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9\gradle-3.3-all.zip在这里删除gradle3.3allzip并通过从本网站再次下载来替换它https://services.gradle.org/distributions/找到相同的文件并下载并粘贴到该位置然后同步您的项目。希望对你也有帮助

删除此目录:

C:\Users\[username]\.gradle

这对我有用。通过取消选中文件>设置>Gradle>离线工作按钮,确保Gradle未设置为离线。

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

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

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

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

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

对于大多数情况,只需重新构建项目就可以了。有时你必须运行./gradlew build --refresh-dependencies,因为已经提到了几个答案(需要很长时间,取决于你有多少依赖项)。然而,有时这些都不起作用:依赖项就是不会更新。然后,你可以这样做:

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

这很荒谬,看起来很疯狂,但实际上我每天都在使用这个过程,仅仅是因为我需要的依赖关系可以更新几十次,没有一个适当的解决方案会有任何效果。

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

  1. 使用命令行选项刷新依赖项。
  2. 您可以通过Gradle删除artefast为缓存的本地缓存并触发构建

使用--刷新-依赖项选项:

./gradlew build --refresh-dependencies

简短的解释--recreh依赖项选项告诉Gradle忽略已解析模块和工件的所有缓存条目。

冗长的解释

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

使用删除:当您删除缓存时

rm -rf $HOME/.gradle/caches/

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

你可以像这样做

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

引用自禁用Gradle Build Cache

当你经常使用Gradle构建>大型项目时,Gradle构建缓存可能是一件好事。但是,当只是偶尔构建开源>项目时,它可以很快变得很大。

要禁用Gradle构建缓存,请将以下行添加到~/.gradle/gradle.properties

org.gradle.caching=false

您可以使用以下命令清理现有缓存

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

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

gradlew clean cleaneclipse build eclipse --refresh-dependencies

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

  1. 打开Android Studio
  2. 单击终端(您将在Android Studio的底部找到它)
  3. 命令工具将打开
  4. 输入您的命令gradlew build --refresh-dependencies

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拖动文件。

删除所有缓存使得再次下载所有依赖项。所以它需要很长时间并且很无聊的事情再次等待重新下载所有依赖项。

我怎么能解决这个下面的方式。

只需删除需要刷新的组。

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

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

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

上面的解决方案都不适合我。

如果你使用IntelliJ,对我来说解决这个问题的方法就是刷新所有Gradle项目:

在此处输入图片描述

适用于Android Studio 3.4.1

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

这应该解决你的问题。

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

在我的情况下,上述都不起作用,我所做的是:

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

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

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

rm -rf $HOME/.gradle/caches/

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

./gradlew build --refresh-dependencies

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

工作配置是

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

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

./gradlew assemble  --refresh-dependencies

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

在此处输入图片描述