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

时间:2016-06-29 17:38:16

标签: gradle dependency-management

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

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

<properties>
    <spring.version>4.2.3.RELEASE</spring.version>
    <spring.boot.version>1.3.3.RELEASE</spring.boot.version>
    ...
</properties>

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

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

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

我最接近的是:

dependencies {
    ext.springVersion = '4.2.3.RELEASE'
    compile "org.springframework:spring-jdbc:$springVersion"
}

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

请注意,Gradle上的尝试不是完全我想要的。我希望能够在单独的文件中定义依赖项,而不是直接在将使用它的文件上。

8 个答案:

答案 0 :(得分:14)

build.gradle文件中的gradle version 4.5文件中的配置为我ext { springVersion = '5.0.3.RELEASE' } dependencies { compile "org.springframework:spring-context:$springVersion" } 工作,将其发布在此处以供将来参考 -

CodedOutputStream

答案 1 :(得分:8)

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

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

subprojects{
    dependencies{
        compile ...
    }
}

这样,您可以在根构建脚本中为子项目提供任何常见配置。阅读它the user guide

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

ext.commomLibs = [
  'testlibs' : 'junit:junit:4.8'
]

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

dependencies{
    testCompile commomLibs.testlibs
}

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

apply from: 'dependencies.script'

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

答案 2 :(得分:2)

使用对我有用的双引号

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

答案 3 :(得分:1)

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

<activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />

            <category android:name="android.intent.category.APP_MESSAGING" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.SENDTO" />
            <category android:name="android.intent.category.DEFAULT" />  <!-- "android.intent.category.DEFAULT"-->
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
        </intent-filter>


        <!-- Sends text to someone .This will enable any Text Share functionality-->
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>

答案 4 :(得分:1)

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

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

    // ...
}

答案 5 :(得分:0)

添加到Vikas Sachdeva的答案中:

在我的子项目中,它不适用于我。 Gradle引发错误“ 找不到org.springframework:spring-context:$ springVersion ”。最后,我通过添加加号解决了我的问题。

例如:

root gradle.properties:

function check_unique_order_no($id = '', $order_no) {
        $this->db->where('order_no', $order_no);
        $this->db->where('status', "A");

        if($id) {
            $this->db->where_not_in('id', $id);
        }
        return $this->db->get('delivery_order')->num_rows();
    }

root build.gradle

springVersion = '5.0.3.RELEASE'

子项目build.gradle

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

注意:我的gradle版本是5.4.1

或者您可以使用该插件来管理您的依赖版本。

  

io.spring.dependency-management

参考:https://docs.spring.io/dependency-management-plugin/docs/current/reference/html/

答案 6 :(得分:0)

我有一个备用语法糖。我猜这是编写依赖项的“漫长”方法。

主“ gradle.build”

plugins {
    id 'java'
}


ext {
    slf4jApiVersion = '1.7.28'
    junitVersion = '4.12'
}

子模块/项目gradle.build

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

请注意组,名称和版本的分隔...组和名称值的SINQLE引号,版本值变量的双引号。

答案 7 :(得分:0)

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

以下实现不适用于单引号。

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

因此,现在我必须将所有单引号转换为双引号。有人可以帮我用单引号使版本值可变吗?