Gradle - 获取依赖的最新发布版本

116

如何告诉 Gradle 以最简单的方式获取 'junit' 依赖并使用其最新的 'release' 版本?

获取 'junit' 依赖,并使用其最新的 'release' 版本。

Maven 和 Ivy 仓库管理对我来说还比较陌生。我尝试了以下步骤,但出现了 Could not resolve dependency ... 错误:

  • 将仓库设置为 mavenCentral(),然后写入 compile "junit:junit:latest.release" (不过如果我改成"junit:junit:4.10"就可以了)。

  • 将仓库设置如下,然后写入 compile "junit:junit:latest.release"

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
    
  • 尝试使用Spring Source Ivy存储库:

  • ivy {
        artifactPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
        ivyPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
    }
    
    也许我误解了什么。为什么获取依赖项的最新版本会如此困难?


动态版本可以作为最新可用版本的占位符,即 latest.integrationGradle 动态版本文档 - Bhavik
6个回答

289

有时获取最新版本非常有用 - 例如,如果您经常发布自己的依赖项。

您可以像这样获取最新版本

compile "junit:junit:+"

或者更好的是至少指定主要版本,例如:

compile "junit:junit:4.+"

37
只是为了记录一下:确实应该使用双引号!我在大多数依赖声明中都使用单引号,后来发现 code 'junit:junit:4.+' 无法正常工作。 - azonli
3
"compile" 应该改成 "testCompile",因为在发布时不需要 artifact。 - Martin Dürrmeier
1
这种方法无法使构建过程可重复,我认为Ben Marten的回答是更好的方法。 - Simon Forsberg
6
并不总是需要可重现构建。 - Lakatos Gyula
2
@SimonForsberg ... 确实如此,但是在开发过程中,您可能希望(a)遵循“最前沿”或(b)确保针对v4.+的错误修复得到更新以用于您的项目。当您达到Alpha、Beta、-RC或-RELEASE阶段时;我完全同意您需要将这些版本“固定”在某个位置。我使用一个“属性”文件来设置版本说明符:compile "junit:junit:${**junitVer**}" - will
显示剩余3条评论

61

Gradle目前不支持Maven的RELEASE(该版本已经很少使用且已过时),但它支持Ivy的latest.release(对于快照版本则使用latest.integration)。然而,一般建议根据精确版本构建代码。否则,构建结果可能会变成彩票。


Maven同样不支持RELEASE。只支持固定的版本号。 - khmarbaise
11
我已经仔细检查过了。Maven在2和3版本中都支持RELEASE - Peter Niederwieser
1
你是正确的。我把它与插件版本搞混了,因为对于Maven 3它不再允许使用RELEASE/LATEST。但是使用这样的版本标识当然是不好的实践。 - khmarbaise
3
Grade支持'latest.release'(但不支持'RELEASE')。这对于确保您自己的内部库处于最新的、经过验证的版本非常有用。当然,出于与Peter上面建议相同的原因,我绝不会主张将其用于外部/第三方库。 - RCross
似乎对快照无效。啊,应该是 latest.integration - bric3
显示剩余2条评论

27

看一下Gradle-Versions-Plugin。它恰好能够实现你想要的功能:https://github.com/ben-manes/gradle-versions-plugin

安装方法请查看该GitHub页面。基本上,你需要将以下两行代码添加到你的build.gradle - 项目文件中:

apply plugin: 'com.github.ben-manes.versions'

buildscript {
    [...]
    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.8'
        [...]
    }
}
[...]

然后您可以在项目目录中的终端运行此命令来使用插件:

./gradlew dependencyUpdates -Drevision=release

它会向您展示哪些依赖项已经过时!


如果您不想在每个项目中都包含插件,也可以将其添加到初始化脚本中。有关详细信息,请参见另一个问题的此答案 - Laurence Gonsalves
如果依赖项在同一存储库中,并且您始终希望使用最新版本,该怎么办? - Barry Kelly

10
最新的Gradle用户指南提到并解释了版本号中的加号符号。
来自“7.2.声明您的依赖项”的链接
dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

根据构建脚本,编译该项目的测试需要任意 junit >= 4.0。

来自23.7. 如何解决依赖关系

如果依赖关系被声明为动态版本(如1.+),Gradle将在仓库中解析为最新可用的静态版本(如1.2)。对于Maven仓库,这是使用maven-metadata.xml文件完成的,而对于Ivy仓库,则通过目录列表完成。


1
重要提示:+ 不一定表示最新版本。请查看我上面的评论。 - Harry G.

3

在Android Studio中:

如果您使用+来指定版本,并想知道实际使用的版本号,可以在侧边栏中选择Project,然后在External Libraries下找到实际使用的版本号。


0

另一种类似的符号表示法是 Kotlin DSL(build.gradle.kts):

dependencies {
    implementation("or.jsoup", "jsoup") {
        version {
            require("1.14.+")
        }
    }
    // OR simply
    // implementation("or.jsoup:jsoup:1.14.+")
}

请阅读Gradle文档以获取更多信息。

文档摘录:

动态版本可以是版本范围(例如2.+),也可以是最新可用版本的占位符,例如latest.integration


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