ChatGPT解决这个技术问题 Extra ChatGPT

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

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


o
outis

通常,您可以使用命令行选项 --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 {} \;
P
Paulo Merson

如果您使用的是最新版本的 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 内部的构建中执行此操作?
A
AMK

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

对于 MAC

./gradlew build --refresh-dependencies

对于 Windows

gradlew build --refresh-dependencies

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


Android 使用常规的 gradle。它只是一个插件。
Gradle 包装器不是 Android 独有的。您可以使用 gradle wrapper 任务生成一个;您甚至可以使用另一个 Gradle 包装器生成包装器:gradlew wrapper
E
Eric

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

从以下目录删除要重新下载的依赖项:C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1 删除路径下的所有元数据目录:C:\Users\%USERNAME %\.gradle\caches\modules-2\metadata-* 在项目的根目录中运行 gradle build(或 gradlew build,如果使用 gradle wrapper)。

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


谢谢,我正在寻找 1 次删除特定依赖项以重新下载。这在 mac 上也是一样的:~/.gradle/caches/modules-2/files-2.1
我没有找到任何元数据文件夹,但删除 modules-2\files-2.1 中的特定依赖项就足够了。谢谢!
K
Ko Ga

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

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

https://i.stack.imgur.com/CHVVJ.png


您还可以从同一视图 stackoverflow.com/a/69584756/1261166 刷新 IntelliJ 中的依赖项
A
Ashraf.Shk786

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

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

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

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


K
Karol Król

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

rm -rf $HOME/.gradle/caches/

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

./gradlew build --refresh-dependencies

J
Jared Rummler

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


x
xarlymg89

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

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


X
Xelian

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

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

使用 --refresh-dependencies 选项:

./gradlew build --refresh-dependencies

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

长解释

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

First Gradle 将发出 HEAD 请求并检查服务器是否报告文件自上次以来未更改(如果“内容长度”和“上次修改”未更改)。在这种情况下,您将收到消息:“缓存的资源是最新的 (lastModified: {})。”

如果可能,Next Gradle 将确定远程校验和(从 HEAD 请求或通过下载“.sha1”文件)。如果此校验和与已下载的另一个文件(从任何存储库)匹配,则 Gradle 将简单地将文件复制到缓存,而不是重新下载。在这种情况下,您将收到消息:““找到具有匹配校验和的本地可用资源:[{},{}]”。

使用删除:删除缓存时

rm -rf $HOME/.gradle/caches/

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


C
Carl Du Plessis

对于 Android Studio 3.4.1

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

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


没有为我工作。可能因情况而异
V
Vinujan.S

对于 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,有时我必须在刷新后关闭并重新打开。
g
grine4ka

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


V
Vadim

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


V
Viktor Mellgren

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

https://i.stack.imgur.com/5c3yN.png


L
Louis

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

在 build.gradle 中,注释与我未解决的导入相关的依赖项

点击“立即同步”

取消评论我刚刚评论的内容

再次单击“立即同步”

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


这是这里唯一对我有用的东西。谢谢!
C
Chamly Idunil

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

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

只需删除需要刷新的组。

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

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

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


J
Jacques Koorts

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

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


e
egorikem

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

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

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


W
WesternGun

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


p
piet.t

你可以这样做

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/包装器/


那不是我们在这里寻找的真正的缓存...
U
ULLAS K

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

gradlew clean cleaneclipse build eclipse --refresh-dependencies

为什么要使用 Eclipse?尤其是2018年!
f
farhang67

删除此目录:

C:\Users\[username]\.gradle

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

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