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

fed*_*lov 680 gradle

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

Ben*_*hko 798

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

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


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

rm -rf $HOME/.gradle/caches/
Run Code Online (Sandbox Code Playgroud)

  • 我不能代表OP,但我的具体用例是测试我的非MavenCentral存储库的配置是否真的有效. (24认同)
  • @Gopinath是危险的建议,因为.m2可以包含maven设置文件.我猜你的意思是删除.m2/repository (18认同)
  • Maven Local仅在您的构建将其定义为存储库时才相关. (17认同)
  • 您还需要删除〜/ .m2目录(如果存在).如果您已经配置了maven repo,那么很少有这些工件也会下载到〜/ .m2.最好删除〜/ .gradle和〜/ .m2以开始清理平板. (6认同)
  • `find $ HOME/.gradle/caches/-name"*LIBRARY_NAME*" - exec rm -r {} \; ` (4认同)
  • @avanderw然后您可能希望以编程方式解决此问题,而不是使用此命令行选项. (2认同)
  • 获取缓存文件夹的备份,以防以后出现问题。 (2认同)

Nag*_*aga 627

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

./gradlew build --refresh-dependencies
Run Code Online (Sandbox Code Playgroud)

你可以参考Gradle手册.

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

  • 您必须注意,由于gradle将尝试下载所有依赖项文件,因此需要很长时间. (10认同)
  • 值得注意的是,这并不总是有效.我刚刚测试了运行"gradle clear war --refresh-dependencies"和一个三天前的缓存jar,当时我昨晚深度部署了一个新版本.由于新代码中添加了缺少的依赖项,构建中断了.之后我还在缓存中放了三天的罐子.我最后只是删除.m2缓存中的版本文件夹并重建.然后它获得了最新版本,因为它基本上没有选择! (8认同)
  • 更好的是./gradlew --refresh-dependencies (6认同)
  • 这与 Android Studio 终端中的“./gradlew build --refresh-dependencies”非常有效。谢谢! (2认同)
  • 有没有办法让Android Studio在IDE内部进行构建? (2认同)

小智 294

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

configurations.all {
    // Check for updates every build
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
Run Code Online (Sandbox Code Playgroud)

扩展:

dependencies {
    implementation group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
}
Run Code Online (Sandbox Code Playgroud)

凝结:

implementation('group:projectA:1.1-SNAPSHOT') { changing = true }
Run Code Online (Sandbox Code Playgroud)

我发现在这此解决方案论坛主题.

  • `cacheChangingModulesFor`是关键,`changing:true`是可选的,因为它是`-SNAPSHOT`所暗示的,可以在这里使用简写:`compile'group:projectA:1.1-SNAPSHOT'`因为上述含义.还可以将resolutionStrategy限制为一个配置:`configurations.compile.resolutionS ...`. (9认同)
  • 您是否碰巧知道这对于同一个库的源是如何工作的?目前,每次更改时都会下载已编译的库,但源不是. (4认同)
  • 谢谢你.FWIW,我们的依赖是在快照版本上,直到我们这样做,它没有检查每个构建的更新. (4认同)
  • 根据定义,快照版本正在"更改".Gradle知道这一点,所以你实际上不需要在依赖声明中定义它. (2认同)
  • @Umi有这个浓缩版吗?比如`compile'c​​om.burrowsapps:ads:1.0:true'`? (2认同)

Ali*_*Ali 60

对于MAC

./gradlew build --refresh-dependencies

对于Windows

gradlew build --refresh-dependencies

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

  • Android使用常规gradle.它只是一个插件. (2认同)

Eri*_*ric 25

对于Windows ...为了使gradle重新下载特定的依赖项:

  1. 从以下目录中删除要重新下载的依赖项:

    C:\Users\[username]\.gradle\caches\modules-2\files-2.1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 删除路径中的所有元数据目录:

    C:\Users\[username]\.gradle\caches\modules-2\metadata-*
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在项目的根目录中运行gradle build(或者gradlew build如果使用gradle包装器).

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


Far*_*han 18

可以使用缓存的jar删除文件夹.

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

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

我删除了缓存的库文件夹(上例中的"cached-library-to-remove"),删除了我的项目的build文件夹并重新编译.然后下载了鲜库.


Jar*_*ler 14

如此处的一些答案所示,您可以删除特定组或工件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
}
Run Code Online (Sandbox Code Playgroud)

用法:

$ deleteGradleCache com.android.support
Run Code Online (Sandbox Code Playgroud)

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


Kar*_*ról 14

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

rm -rf $HOME/.gradle/caches/
Run Code Online (Sandbox Code Playgroud)

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

./gradlew build --refresh-dependencies
Run Code Online (Sandbox Code Playgroud)


kga*_*oid 13

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

  1. 打开安卓工作室
  2. 点击终端(你会在Android Studio的基础中找到它)
  3. 命令工具将打开
  4. 输入您的命令 gradlew build --refresh-dependencies


Vik*_*ren 13

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

在此输入图像描述

  • 要访问上述菜单,请在顶部单击:视图 -> 工具窗口 -> Gradle。然后在 Gradle 窗口中右键单击根项目,您将看到上面的对话框。 (3认同)

Car*_*sis 12

对于 Android Studio 3.4.1

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

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


Xel*_*ian 8

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

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

使用--refresh-dependencies选项:

./gradlew build --refresh-dependencies
Run Code Online (Sandbox Code Playgroud)

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

长解释

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

使用删除:删除缓存时

rm -rf $HOME/.gradle/caches/
Run Code Online (Sandbox Code Playgroud)

您只需清理所有缓存的jar和sha1总和,Gradle就会出现机器上没有工件并且必须下载所有内容的情况.是的,它将首次100%工作,但是当另一个SNAPSHOT被释放并且它是您的依赖树的一部分时,您将在选择之前再次面对刷新或清除缓存.


Vin*_*n.S 8

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

工作配置

implementation("com.sample:commons:1.0.0-SNAPSHOT") {
        isChanging = true
    }
Run Code Online (Sandbox Code Playgroud)

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

./gradlew assemble  --refresh-dependencies
Run Code Online (Sandbox Code Playgroud)

  • 很有用,谢谢。此外,如果其他人像我一样使用 IntelliJ,有时我必须在刷新后关闭并重新打开。 (2认同)

Jua*_*dez 7

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

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

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
Run Code Online (Sandbox Code Playgroud)

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

implementation('com.github.juanmendez:ThatDependency:ThatBranch-SNAPSHOT') {
    changing = true
}
Run Code Online (Sandbox Code Playgroud)

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


Kob*_*Gal 6

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

如果您使用IntelliJ,那么对我来说解决的就是简单地刷新所有Gradle项目:

在此处输入图片说明

  • 您还可以从同一视图刷新 IntelliJ 中的依赖项 /sf/answers/4870932951/ (2认同)

Vad*_*dim 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
Run Code Online (Sandbox Code Playgroud)

之后gradle从nexus拖动文件。


Lou*_*uis 5

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

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

然后我的导入再次得到正确解决。

  • 这是这里唯一对我有用的事情。谢谢你! (2认同)