如何在Gradle中为依赖项版本定义变量

Rod*_*aki 34 dependency-management gradle

我目前正在尝试将Maven项目迁移到Gradle

在我的Maven版本中,我的所有依赖版本都在我的 pom中列出如下:

<properties>
    <spring.version>4.2.3.RELEASE</spring.version>
    <spring.boot.version>1.3.3.RELEASE</spring.boot.version>
    ...
</properties>
Run Code Online (Sandbox Code Playgroud)

然后我可以在任何子模块中定义这样的依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我试图做同样的事情Gradle,因为我的一些模块共享依赖的版本是这样的,我不希望修改一个以上的地方,如果我想升级Spring或做类似的操作.

我得到的最接近的是:

dependencies {
    ext.springVersion = '4.2.3.RELEASE'
    compile "org.springframework:spring-jdbc:$springVersion"
}
Run Code Online (Sandbox Code Playgroud)

然而,这仍然不起作用.在Gradle中实现此目的的推荐方法是什么?或者Gradle对待这种方式有何不同?也许我对Maven的看法仍然太多,无法看到另一种解决方案.

请记住,对Gradle的尝试并不完全 是我想要的.我希望能够在一个单独的文件中定义依赖项,而不是直接在将使用它的文件上.

Vik*_*eva 24

以下build.gradle文件中的配置为我工作gradle version 4.5,在此发布以供将来参考 -

ext {
    springVersion = '5.0.3.RELEASE'
}

dependencies {
    compile  "org.springframework:spring-context:$springVersion"
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,<compile>中的单引号不起作用,应该是double. (11认同)
  • 将“compile”替换为“implementation”后,我可以确认它可以与“gradle version 5.6”和“gradle version 6.2”一起使用 (2认同)

Dim*_*sus 11

您现在可以使用更接近App Gradle Build中的依赖项,如下所示:

dependencies {
    def daggerVersion = "2.24"
    implementation "com.google.dagger:dagger:$daggerVersion"
    annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
}
Run Code Online (Sandbox Code Playgroud)


Sta*_*lav 9

您提供依赖项版本的方式是正确的,应该可行.IntelliJ Idea在gradle构建脚本中的变量存在一些问题,因此您不必依赖它,只需尝试运行构建和检出,是否已下载依赖项并且您的项目是否正确构建.

如果您希望将项目依赖项存储在单独的文件中,那么最常见的方法是在根build.script中定义它们,通过subprojects所有子项目的闭包来定义,或者allprojects如果您希望为所有项目指定依赖项,则包括根.这将是这样的:

subprojects{
    dependencies{
        compile ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以在根构建脚本中为子项目提供任何常见配置.阅读用户指南

或者,您可以在根构建脚本中声明变量,将其初始化为具有所需所有依赖项规范的映射,或者将其初始化为具有单个依赖项列表的数组,并在子项目中使用此变量(如果需要).在根中有这样的事情:

ext.commomLibs = [
  'testlibs' : 'junit:junit:4.8'
]
Run Code Online (Sandbox Code Playgroud)

注意,您可以将map的值定义为lib规范的数组,以使其指向所有这些依赖项.然后您可以在子项目中使用它:

dependencies{
    testCompile commomLibs.testlibs
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用具有依赖关系的单独构建脚本,并将其应用于您需要的构建脚本,如此

apply from: 'dependencies.script'
Run Code Online (Sandbox Code Playgroud)

然后,您可以将依赖项放入依赖项脚本中,然后将其应用于需要此依赖项和/或可能是某些常见逻辑的任何其他构建脚本中.


Kum*_*hek 9

使用双引号对我有用

buildscript {
    ext {
        springBootVersion = '2.0.4.RELEASE'
        hazelCastVersion = '3.10.4'
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")

    }
}

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-config')
    compile "com.hazelcast:hazelcast-spring:${hazelCastVersion}"
    compile group: 'com.hazelcast', name: 'hazelcast', version: "${hazelCastVersion}" }
Run Code Online (Sandbox Code Playgroud)

  • “ext”和“buildscript.ext”有什么区别? (2认同)