【问题标题】:How can I force gradle to redownload dependencies?如何强制 gradle 重新下载依赖项?
【发布时间】:2012-11-13 22:38:46
【问题描述】:

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

【问题讨论】:

    标签: gradle


    【解决方案1】:

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

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


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

    rm -rf $HOME/.gradle/caches/
    

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

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

    [...]

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

    【讨论】:

    • 我不能代表 OP,但我的具体用例是测试我对非 MavenCentral 存储库的配置是否真的有效。
    • 您还需要删除 ~/.m2 目录(如果存在)。如果你已经配置了 maven repo,那么这些工件中的一些也会被下载到 ~/.m2。最好同时删除 ~/.gradle 和 ~/.m2 以从头开始。
    • Maven Local 仅在您的构建将其定义为存储库时才相关。
    • @Gopinath 这是一个危险的建议,因为 .m2 可以包含一个 Maven 设置文件。我猜你的意思是删除 .m2/repository
    • find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,我一直在寻找 1 次删除特定依赖项以重新下载。 mac上也是这样:~/.gradle/caches/modules-2/files-2.1
      【解决方案4】:

      对于 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,有时我必须在刷新后关闭并重新打开。
      【解决方案5】:

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

      rm -rf $HOME/.gradle/caches/
      

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

      ./gradlew build --refresh-dependencies
      

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 这是唯一对我有用的东西。谢谢!
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            我在forum thread 找到了这个解决方案。

            【讨论】:

            • 你碰巧知道这对于同一个库的源是如何工作的吗?目前,编译后的库每次更改都会下载,但源不是。
            • 快照版本根据定义正在“变化”。 Gradle 知道这一点,因此您实际上不需要在依赖项声明中定义它。
            • 谢谢。 FWIW,我们的依赖是快照版本,在我们这样做之前,它不会检查每个构建的更新。
            • cacheChangingModulesFor 是关键,changing: true 是可选的,因为它被-SNAPSHOT 暗示,这里可以使用简写:compile 'group:projectA:1.1-SNAPSHOT' 因为上面的暗示。也可以将 resolutionStrategy 限制为一个配置:configurations.compile.resolutionS...
            • @Umi 这个有精简版吗?比如compile 'com.burrowsapps:ads:1.0:true'?
            【解决方案10】:

            适用于 Android Studio 3.4.1

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

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

            【讨论】:

              【解决方案11】:

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

              如果您使用 IntelliJ,我只需刷新所有 Gradle 项目即可解决它:

              【讨论】:

              【解决方案12】:

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

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

              只需删除需要刷新的组。

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

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

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

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  【解决方案14】:

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

                  ./gradlew build --refresh-dependencies
                  

                  您可以参考Gradle manual

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

                  【讨论】:

                  • 需要注意的是,由于 gradle 会尝试下载所有依赖文件,所以需要很长时间。
                  • 同样值得注意的是,这并不总是有效。我刚刚测试了运行“gradle clear war --refresh-dependencies”和一个三天前的缓存jar,当我昨晚很晚部署了一个新版本时。由于缺少新代码中添加的依赖项,构建中断。之后我的缓存中仍然保留了三天大的罐子。我最终只是删除了 .m2 缓存中的版本文件夹并重建。然后它得到了最新版本,因为它基本上别无选择!
                  • 更好但只是 ./gradlew --refresh-dependencies
                  • 这在 Android Studio 终端中作为 './gradlew build --refresh-dependencies' 非常有效。谢谢!
                  • 有没有办法让 Android Studio 在 IDE 内部的构建中执行此操作?
                  【解决方案15】:

                  如果你正在使用 eclipse 并且你想强制 eclipse 重新加载依赖项,你可以尝试下面的命令

                  gradlew clean cleaneclipse build eclipse --refresh-dependencies
                  

                  【讨论】:

                  • 为什么要使用 Eclipse?尤其是在 2018 年!
                  【解决方案16】:

                  这对我有用。 通过取消选中 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 面板并单击蓝色圆圈箭头按钮。我总是可以看到我的更新获得了新的副本。

                  【讨论】:

                    【解决方案17】:

                    你可以这样做

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

                    引用Disabling the Gradle Build Cache

                    当您经常使用 Gradle 构建大型项目时,Gradle 构建缓存可能是一件很棒的事情。但是,如果只是偶尔构建开源 > 项目,它会很快变大。

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

                    org.gradle.caching=false
                    

                    您可以使用清理现有缓存

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

                    【讨论】:

                      【解决方案18】:

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

                      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 发布并且它是您的依赖关系树的一部分时,您将再次面临刷新或清除缓存的选择。

                      【讨论】:

                        【解决方案19】:

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

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

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

                        【讨论】:

                          【解决方案20】:

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

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

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

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

                          【讨论】:

                            【解决方案21】:

                            对于 MAC

                            ./gradlew build --refresh-dependencies

                            适用于 Windows

                            gradlew build --refresh-dependencies

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

                            【讨论】:

                            • Android 使用常规 gradle。它只是一个插件。
                            • Gradle 包装器不是 Android 独有的。您可以使用gradle wrapper 任务生成一个;你甚至可以使用另一个 Gradle 包装器生成一个包装器:gradlew wrapper
                            【解决方案22】:

                            删除此目录:

                            C:\Users\[username]\.gradle
                            

                            【讨论】:

                            • 鉴于可能存在本地配置,因此删除(或重命名/重定位)其他答案中提到的缓存目录是更好的解决方案。
                            【解决方案23】:

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

                            【讨论】:

                              【解决方案24】:

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

                              【讨论】:

                                【解决方案25】:

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

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

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2020-08-10
                                  • 2016-01-30
                                  • 2016-01-11
                                  • 2014-03-15
                                  • 2023-03-15
                                  • 2020-07-20
                                  • 2015-03-20
                                  • 2018-06-19
                                  相关资源
                                  最近更新 更多