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


Answers:


845

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

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


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

rm -rf $HOME/.gradle/caches/

27
我不能代表OP,但是我的特定用例是测试我对非MavenCentral存储库的配置是否确实有效。
Emil Lundberg 2013年

7
您还需要删除〜/ .m2目录(如果存在)。如果您已经配置了maven repo,那么这些工件中的极少数也将下载到〜/ .m2。最好同时删除〜/ .gradle和〜/ .m2,以从头开始。
Gopinath MR 2014年

17
仅当您的构建将其定义为存储库时,Maven Local才有意义。
本杰明·穆奇科

21
@Gopinath是危险的建议,因为.m2可能包含Maven设置文件。我猜你的意思是删除.m2 /存储库
Ward

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

708

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

./gradlew build --refresh-dependencies

您可以参考Gradle手册

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


10
您必须注意,由于gradle会尝试下载所有依赖项文件,因此需要花费很长时间。
娜迦

11
还值得注意的是,这并不总是有效的。当我昨晚深夜部署了一个新版本时,我刚刚使用了一个三天的缓存jar测试了运行“渐进式战争-刷新依赖关系”。由于新代码中添加了缺少的依赖项,因此构建失败。之后,我仍将三天大的罐子放在缓存中。我最终只是删除了.m2缓存中的版本文件夹并进行了重建。然后,它获得了最新版本,因为它基本上别无选择!
Spanky Quigman

10
更好的只是./gradlew --refresh-dependencies
headsvk

1
在Android Studio终端中,这非常适合“ ./gradlew build --refresh-dependencies”。谢谢!
the_dude_abides

2
有没有办法让Android Studio在IDE内部的构建上执行此操作?
karl

313

您可以通过将依赖项标记为“更改”来告诉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 }

我在此论坛线程中找到了此解决方案。


4
您是否偶然知道这对于同一库的源代码如何起作用?当前,编译的库每次更改时都会下载,但源不会。
MarkusWüstenberg2014年

2
快照版本根据定义正在“更改”。Gradle知道这一点,因此您实际上不需要在依赖项声明中定义它。
本杰明·穆奇科

4
谢谢你 FWIW,我们的依赖关系是快照版本,直到执行此操作,才检查每个构建的更新。
sfitts

10
cacheChangingModulesFor是键,changing: true是可选的,因为它由隐含表示-SNAPSHOT,因此可以在此处使用简写形式:compile 'group:projectA:1.1-SNAPSHOT'由于上述含义。也可以将resolutionStrategy限制为一种配置:configurations.compile.resolutionS...
TWiStErRob 2014年

2
@Umi是否有压缩版?如compile 'com.burrowsapps:ads:1.0:true'
Jared Burrows

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 '19

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

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

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

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

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


16

您可以删除特定组或工件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将重新下载依赖项。


9

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

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

使用--refresh-dependencies选项:

./gradlew build --refresh-dependencies

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

长说明

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

使用删除:删除缓存时

rm -rf $HOME/.gradle/caches/

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


9

这对我有用。通过取消选中“文件”>“设置”>“ Gradle”>“脱机工作”中的按钮,确保Gradle未设置为脱机。

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

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

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

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

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


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

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


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 [用户名] .gradle \ wrapper \ dist \ gradle3.3-all \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip在这里删除gradle3.3allzip并通过从此站点再次下载进行替换以替换它 :https:/ /services.gradle.org/distributions/ 查找相同的文件,然后下载并将其粘贴到该位置,然后同步您的项目。希望它也对您有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.