如何强制更新Intellij中所有快照Gradle依赖项的版本?

106

我有一个项目,使用gradle作为构建工具,在intellij中使用SNAPSHOT依赖。

问题在于,intellij使用的SNAPSHOT已经过时了。 enter image description here

当我在命令行上构建项目时

gradle build or 
gradle clean build --refresh-dependencies

在命令行上,可以获取最新的依赖项。我也设置了我的grade文件,使其始终下载快照依赖项,根据这个答案
如何强制Intellij下载所有依赖项?
6个回答

139

在IntelliJ 2017.2中,您可以在Gradle工具窗口中右键单击项目名称,然后从上下文菜单中选择刷新依赖项

在IntelliJ 2017.2中刷新Gradle依赖项

这将刷新所有依赖项,不仅限于SNAPSHOTS,因此可能需要一些时间。我不知道其他版本的IntelliJ是否也具有此功能。


6
可以使用这个方法,但速度非常慢。有没有人知道如何优化以仅获取最新的快照? - User1
如果您正在上传快照,则在快速修复时附加提交编号... 1.0.0-SNAPSHOT-1 - Kevvvvyp
如果快照有更改并且版本相同,则此方法无法正常工作。 - Gilberto Ibarra

54

我遇到了一些非常棘手的快照问题,你可以尝试以下几个选项:

  • 在Gradle选项卡(UI的右侧)中,点击蓝色循环箭头图标,刷新依赖项(在大多数情况下有效)
  • 如果那不起作用,请尝试使用IntelliJ中的绿色“运行Gradle命令”图标来运行gradle命令-- 这将在IntelliJs环境中运行命令而不是本地机器中。
  • 如果这两个都失败了,您可以修改Gradle resolutionStrategy设置为类似以下内容: configurations.all { resolutionStrategy.cacheDynamicVersionsFor 4, 'hours' resolutionStrategy.cacheChangingModulesFor 4, 'hours' } 这个配置更改是一个最后的选择,应该谨慎使用。它基本上告诉Gradle更频繁地刷新本地缓存。在进行这些更改后,应单击IntelliJ Gradle刷新按钮。

在Intellij的Gradle选项卡中,顶部有一个绿色图标,可以让你在IDE中执行gradle命令。 - cjstehno
1
啊,我明白你的意思了,然后呢?gradle clean build --refresh-dependencies - elect

34

另一个选择是打开项目结构,在项目设置中找到"Libraries",在列表中找到依赖项并删除它。然后按下Gradle刷新蓝色循环箭头图标,IntelliJ应该获取最新版本。

enter image description here

enter image description here


7
在尝试其他答案后(也许需要在--refresh-dependencies解决方案之后进行),这是唯一对我有效的解决方案。 - Miloš Černilovský

24

IntelliJ IDEA ULTIMATE 2020.1

在Gradle工具窗口中,右键单击项目名称,从上下文菜单中选择刷新Gradle依赖项

输入图片描述


14

编辑

在Gradle 6+中,默认情况下快照是“可变的”。因此,不再需要设置 changing = true 。但您仍然需要将 resolutionStrategy.cacheChangingModulesFor 设置为0秒。


先前的答案:

默认情况下,Gradle会缓存更改的模块24小时。我们可以通过在构建脚本中标记这些为'changing'来告诉Gradle刷新或重新下载依赖项。

请按以下步骤操作:

步骤#1:通过将cacheChangingModulesFor属性的值设置为0秒,告诉Gradle不要缓存更改的模块:

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

步骤 #2: 标记需要刷新或重新下载的依赖项,作为更改的模块:

dependencies {
    implementation("com.howtoprogram.buysell:payment-api:0.0.1-SNAPSHOT") {
        changing = true
    }
}

来源:刷新或重新下载Gradle依赖项


1
在Kotlin 6.8.x的方言中,该属性被称为isChanging。但似乎这是一件事情。如果他们能够自动地为快照版本执行此操作,那将是很好的。 - Jilles van Gurp
@JillesvanGurp 好吧,自 Gradle 6 开始就是这种情况了,请参见编辑。 - Louis CAD
是的,但需要注意的是,它只会每24小时检查一次,除非你将其更改为更合理的时间。我们最终配置了一个 configurations.all { resolutionStrategy { cacheChangingModulesFor(60, TimeUnit.SECONDS) } } 来解决这个问题。 - Jilles van Gurp
这对我来说是最好的解决方案。 - undefined

3

确保IntelliJ添加所有依赖项的最简单方法是使项目缓存失效并重新启动。重新加载项目需要约1分钟时间。

INTELLIJ IDE

File -> Invalidate Caches/Restart...

现在,如果要确保使用最新的快照版本,则必须在 gradle.build 文件中指定所使用的依赖项版本。

通常,在大多数存储库中没有“latest”锚定版本。您只需查看并确定最新版本即可。

理论上,如果您知道发布日期和版本控制系统,可以编写 Groovy 函数返回依赖项 URL 并将其传递给 implementation。

def getLatestVersion(){
 ...build version string
return version //As string
}

implementation getLatestVersion()

即使您参考了CI/CD管道,在任何超出您控制范围的情况下进行更改,也不建议这样做。


非常感谢。我花了几个小时在这上面奋斗。 - Wirat Leenavonganan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接