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

如何在Gradle中为依赖项版本定义变量,gradle,dependency-management,Gradle,Dependency Management,我目前正在尝试将Maven项目迁移到Gradle 在我的Maven版本中,我在我的parentpom中列出了所有依赖版本,如下所示: <properties> <spring.version>4.2.3.RELEASE</spring.version> <spring.boot.version>1.3.3.RELEASE</spring.boot.version> ... </properties>

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

在我的
Maven
版本中,我在我的parentpom中列出了所有依赖版本,如下所示:

<properties>
    <spring.version>4.2.3.RELEASE</spring.version>
    <spring.boot.version>1.3.3.RELEASE</spring.boot.version>
    ...
</properties>
但这仍然不起作用。在Gradle实现这一目标的推荐方法是什么?还是格拉德尔对待这件事的态度有所不同?也许我对Maven的想法太多了,看不到另一个解决方案


请记住,对格拉德尔的那次尝试并不是我想要的。我希望能够在一个单独的文件中定义依赖项,而不是直接在将使用它的文件上定义依赖项。

您提供依赖项版本的方式是正确的,应该可以工作。IntelliJ Idea在gradle构建脚本中的变量方面存在一些问题,因此您不必依赖它,只需尝试运行您的构建并检查是否下载了依赖项以及您的项目是否正确构建

如果您希望将项目依赖项存储在单独的文件中,那么最常见的方法是在root build.script中定义它们,通过
子项目
关闭所有子项目,或者通过
所有项目
(如果您希望为所有项目指定包含根项目的依赖项)。这将如下所示:

subprojects{
    dependencies{
        compile ...
    }
}
通过这种方式,您可以在根构建脚本中为子项目提供任何公共配置。读一读

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

ext.commomLibs = [
  'testlibs' : 'junit:junit:4.8'
]
注意,您可以将映射的值定义为lib规范的数组,使其指向所有这些依赖项。然后您可以在子项目中使用它,如下所示:

dependencies{
    testCompile commomLibs.testlibs
}
另一种选择是使用带有依赖项的单独构建脚本,并将其应用于所需的buils脚本,如下所示

apply from: 'dependencies.script'

然后,您可以将依赖项放到依赖项脚本中,并将其应用到任何其他构建脚本中,您需要这些依赖项和/或可能是一些常见的逻辑。

下面是
build.gradle
文件中的配置,我使用了
gradle版本4.5
,将其发布在此处以供将来参考-

ext {
    springVersion = '5.0.3.RELEASE'
}

dependencies {
    compile  "org.springframework:spring-context:$springVersion"
}

使用双引号这对我很有效

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}" }

对Vikas Sachdeva的回答补充如下:

在我的子项目中,这种方式对我不起作用。Gradle抛出错误“找不到org.springframework:spring上下文:$springVersion”。最后,我通过添加加号解决了我的问题

例如:

根gradle.properties:

根构建.gradle

子项目build.gradle

注意:我的gradle版本是5.4.1

或者你可以使用插件管理你的依赖版本

io.spring.dependency-management


参考文献:

我有另一种语法。我想这是编写依赖关系的“漫长”方式

大师“gradle.build”

子模块/项目gradle.build

plugins {
    id 'java'
}


ext {
    slf4jApiVersion = '1.7.28'
    junitVersion = '4.12'
}
dependencies {
    testCompile group: 'junit', name: 'junit', version: "${junitVersion}"
    compile group: 'org.slf4j', name: 'slf4j-api', version: "${slf4jApiVersion}"
}

请注意组、名称和版本的分隔。。。SINQLE在group和name值周围加引号,在version value变量周围加双引号。

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

dependencies {
    def daggerVersion = "2.24"
    implementation "com.google.dagger:dagger:$daggerVersion"
    annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
}

在gradle v6.1.1上,最简单的是:

dependencies {
    def jerseyVersion = '2.29.1'
    compile group: 'org.glassfish.jersey.core', name: 'jersey-client', version: jerseyVersion

    // ...
}

版本值变量仅在双引号中起作用

ext {
   springBootVersion = '2.2.7.RELEASE'
}
dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-web:$springBootVersion'
}
下面的实现不适用于单引号

ext {
   springBootVersion = '2.2.7.RELEASE'
}
dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-web:$springBootVersion'
}
下面的一个使用双引号:->

ext {
    springBootVersion = '2.2.7.RELEASE'
}
dependencies {
    implementation "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
}

所以,现在我必须将所有单引号转换为双引号。有人能帮我让version-value变量使用单引号吗?

我在依赖项块之前见过“ext.”赋值的例子。当你说“这仍然不起作用”时,到底发生了什么?IDE指出错误,说找不到变量,也没有导入库。。。但是,再一次,也许这与IntelliJ IDEA比gradle更相关。请注意,中的单引号不起作用,应该是双引号。在用
实现
替换
编译
后,我可以确认它与
gradle版本5.6
gradle版本6.2
在子项目中可能起作用,你有单引号,不是双引号。Groovy/Gradle在“${foo}”和“${foo}”之间产生了区别。只有第一个可以代替。还请注意,gradle.properties不适合包含依赖项版本。通常的方法是在build.gradle文件中使用额外的属性,如“ext{…}”。感谢您在这个答案中包含“compile group”语法。ext
buildscript.ext
之间有什么区别?不要使用答案部分提问。改为问一个新问题,如果它与你的问题相关,请将此问题链接到你的问题中。你能使用
应用于:
给出替代方法的说明吗?
dependencies {
    def daggerVersion = "2.24"
    implementation "com.google.dagger:dagger:$daggerVersion"
    annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
}
dependencies {
    def jerseyVersion = '2.29.1'
    compile group: 'org.glassfish.jersey.core', name: 'jersey-client', version: jerseyVersion

    // ...
}
ext {
   springBootVersion = '2.2.7.RELEASE'
}
dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-web:$springBootVersion'
}
ext {
    springBootVersion = '2.2.7.RELEASE'
}
dependencies {
    implementation "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
}